Python哈希MD5不等于SQL Server

时间:2019-01-31 13:47:35

标签: python sql-server hash md5

我正在尝试从Python 3和SQL生成相同的MD5代码,但总是得到不同的结果。

使用此唯一标识符f033b004-eb80-412d-9773-f4f06bb994c1

SELECT  HASHBYTES('MD5', 'f033b004-eb80-412d-9773-f4f06bb994c1')

结果:0x9BCE8D23CAC76AF4F61C04673CDD0081

然后我进行计算

SELECT  ABS(HASHBYTES('MD5', 'f033b004-eb80-412d-9773-f4f06bb994c1')  % 10)

结果:5

现在使用python,我使用hashlib

import hashlib

m = hashlib.md5('f033b004-eb80-412d-9773-f4f06bb994c1'.encode() )
m.digest(), m.hexdigest()

结果:b'\x9b\xce\x8d#\xca\xc7j\xf4\xf6\x1c\x04g<\xdd\x00\x81', '9bce8d23cac76af4f61c04673cdd0081'

然后我进行相同的计算

    int.from_bytes( b'\x9b\xce\x8d#\xca\xc7j\xf4\xf6\x1c\x04g<\xdd\x00\x81',
                    byteorder='big', 
                    signed=False )%10

结果:9

有人知道如何从Python代码中获得与SQL Server相同的结果吗?

2 个答案:

答案 0 :(得分:0)

这是因为SQL Server以大写形式返回MD5哈希,以小写形式返回Python。当然,大写和小写字节具有不同的字节值。

答案 1 :(得分:0)

只是遇到了这个问题...问题是,当SQL Server将哈希转换为整数以执行模数运算时,由于十六进制太大,它将无法为您提供正确的整数(请查看此处的最佳答案: Conversion of long Hex string to Integer not working as expected (works in SQL)

另一方面,python可以正确执行转换,因为最大整数大小与内存允许的大小一样