生成 SHA-512 哈希时,如何在 Python 中重现 SQL NVARCHAR 的行为?

How to reproduce the behavior of SQL NVARCHAR in Python when generating a SHA-512 hash?

我有以下 SQL 查询

SELECT CONVERT(VARCHAR(254), HASHBYTES('SHA2_512', CONVERT(NVARCHAR(24), '2020-05-27 00:00:00.000', 127)), 2)

生成哈希值

E8FD9193FA939608DF127AC73428EB39F66CB6F44440083EF269A1F72176BF7BF80C3EB26BA43277E6F9CFFB4F7AFC6AA83AF527BEDF887E4EE06BA492CAD3BE

超出今天的日期,我想在 Python 中使用

重现此哈希
hashlib.sha512('2020-05-27 00:00:00.000'.encode()).hexdigest().upper()

但我明白了

FE48F900755B4C19039E6886148566DF93730A7887771C7A72260BB4E784080CDDA6C70C428A6EEFED658846F45F3D153C6B6472C04508B9242C14C61BD1C1BE

作为哈希值。当我使用 VARCHAR 而不是 NVARCHAR 时,我得到了正确的散列值。如何在 Python 中重现 NVARCHAR 的行为?

NVARCHAR 编码为 UTF-16LE。将其添加到

hashlib.sha512('2020-05-27 00:00:00.000'.encode('utf_16_le')).hexdigest().upper()

创建正确的散列值。

nvarchar 和默认 python 字符串都应该是 unicode 和多字节字符。但是,还有两种子类型。 Big Endian 和 Little Endian 的不同之处。低字节序将为您工作。使用'utf-16le'编码得到你想要的答案。

hashlib.sha512('2020-05-27 00:00:00.000'.encode('utf-16le')).hexdigest().upper()