512散列时重现sqlnvarchar的行为?

q1qsirdb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(383)

我有以下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的巴哈维奥?

vdgimpew

vdgimpew1#

nvarchar编码为utf-16le。将其添加到

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

创建正确的哈希值。

ltskdhd1

ltskdhd12#

nvarchar和默认python字符串都应该是unicode和多字节字符。但是,还有两个子类型。大端和小端的区别。low endian会为你工作的。使用“utf-16le”编码获得您想要的答案。

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

相关问题