Python的哈希MD5值与SQL Server不相等

8
我正在尝试从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相同的结果吗?


你尝试过改变字节顺序吗? - Cato
是的,我做了那个,抱歉没写答案,但它不像SQL Server。它给我返回了1。 - dapo
在 Python 方面,您正在将 bytes 转换为 int 并取模。而在 SQL Server 上,您正在对 HASHBYTES 的输出进行取模 - 这是一个 VARBINARY。您确定 VARBINARY 的模与转换为整数的值的模相同吗? - snakecharmerb
不,我不确定。但是你知道我该如何在Python 3中正确地检查它或执行它吗? - dapo
3个回答

0
这对BigQuery来说是正确的,不确定SQL Server是否也适用,但这种差异的原因是BigQuery的MD5、SHA-1、SHA-256和SHA-512函数返回哈希值的base64编码表示,而Python的hashlib库返回十六进制表示。这段代码将返回与SQL相同的值。
    hash_obj = hashlib.md5()
    hash_obj.update(input_string.encode())
    hash_bytes = hash_obj.digest()
    base64_encoded = base64.b64encode(hash_bytes).decode()

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

我已经测试过了,但是无论MD5是小写还是大写,我都得到了相同的结果。如果您得到与SQL Server相同的结果,请将您的Python代码的3-4行发布给我。 - dapo

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接