Python - Windows 和 Linux 上相同字典值的不同哈希值

Python - Different hash values for same dict values on Windows and Linux

我已经遍历了所有关于不同 platforms.But none 上相同字符串的不同哈希值的问题和答案,解决了我的 issue.It 如果我知道为什么会有所帮助以下案例失败

我的代码:

import hashlib
import binascii

params = "{'name':'xyz-3113','sur_name':'karuna_karan_3113' ,'init_range':'500','power_down_range':'0','power_high_range':'1000'}"
name = 'xyz'

def generateHash(name,paramsDict={}):

    paramsDict = eval(paramsDict)

    key = hashlib.md5(str(name)+str(paramsDict))
    bin_key = key.digest()
    return bin_key

hash_key = generateHash(name, params)
print binascii.hexlify(hash_key)

Windows 中的输出: ea94e618b69f10d55dcd27562fb06378

Linux 中的输出: 6d1a40ae190c63f687456a46321165e9

更多的是不同Python版本之间的区别。例如。在我的 macOS 上,我在 Python 2 和 Python 3.

之间得到不同的结果

在Python 2:

eval(params)
{'power_high_range': '1000', 'power_down_range': '0', 'sur_name': 'karuna_karan_3113', 'name': 'xyz-3113', 'init_range': '500'}

在Python 3:

eval(params)                                                                                                        
{'name': 'xyz-3113', 'sur_name': 'karuna_karan_3113', 'init_range': '500', 'power_down_range': '0', 'power_high_range': '1000'}

dict中的字段顺序不一样,所以str(paramsDict)不一样,结果也不一样。请注意,即使 Python 3 保留了顺序,它也被视为实现细节,不应依赖它。改为对成员进行排序以保证特定顺序。

正如其他人所观察到的,问题很可能与 dict 项目的排序有关。这是解决它的一种方法:

def generate_hash(name, paramsDict):
    strd = ''.join([str(k) + str(v) for k, v in sorted(paramsDict.items())])
    key = hashlib.md5(str(name) + strd)
    bin_key = key.digest()
    return bin_key

除了对 dict 项进行显式排序外,我还删除了 paramsDict 参数的默认值,因为这可能会导致意外行为。

如果未在函数外部使用原始摘要值,我建议返回 key.hexdigest() 以避免需要导入 binascii.