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
.
我已经遍历了所有关于不同 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
.