Python Hash MD5 不等于 SQL Server
Posted
技术标签:
【中文标题】Python Hash MD5 不等于 SQL Server【英文标题】:Python Hash MD5 not equal to SQL Server 【发布时间】:2019-06-24 23:59:06 【问题描述】:我正在尝试从 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 相同的结果?
【问题讨论】:
你试过改变字节顺序吗? 是的,我这样做了,很抱歉没有写出答案,但它不像 SQL Selver。它返回我 1。 在 Python 端,您将bytes
转换为int
,并取int
的模数。在 SQL Server 上,您将取 HASHBYTES
的输出模数 - 一个 VARBINARY
。您确定 VARBINARY
的模数与转换为整数的值的模数相同吗?
不,我不确定。但是您知道如何在 Python 3 中检查或正确执行吗?
【参考方案1】:
这是因为 SQL 服务器以大写形式返回 MD5 哈希值,而 Python 以小写形式返回。当然,大写和小写字节具有不同的字节值。
【讨论】:
我已经测试过了,但即使 MD5 是小写或大写,我也会得到相同的结果。如果你得到与大写 SQL Server 相同的结果,请将你的 Python 代码的 3-4 行发给我。【参考方案2】:刚刚遇到这个...问题是当 SQL 服务器将哈希转换为整数以执行取模时,它不会为您提供正确的整数,因为十六进制太大(查看此处的最佳答案: Conversion of long Hex string to Integer not working as expected (works in SQL))
另一方面,python 可以正确进行转换,因为最大整数大小与内存允许的一样大
【讨论】:
以上是关于Python Hash MD5 不等于 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章