【问题标题】:Python Hash MD5 not equal to SQL ServerPython Hash MD5 不等于 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 中检查或正确执行吗?

标签: python sql-server hash md5


【解决方案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 可以正确进行转换,因为最大整数大小与内存允许的一样大

【讨论】:

    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多