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的主要内容,如果未能解决你的问题,请参考以下文章

Python 文件Hash(MD5,SHA1)

python [Python:哈希文件(内存高效)] #hash#md5

python加密---hashlib模块

python加密包

Python md5()加密

从 md5 更改为 password_hash