Cla*_*diu 6 python hash compatibility backwards-compatibility
我目前正在使用hash
整数和字符串元组(以及整数和字符串的嵌套元组等)来计算某些对象的唯一性.除非可能存在哈希冲突,我想 - hash
这些数据类型的函数是否保证为不同版本的Python返回相同的结果?
Zer*_*eus 10
否.除了32位和64位版本的Python之间存在长期差异之外,Python 3.3中的哈希算法已经改变,以解决安全问题:
默认情况下,str,bytes和datetime对象的hash()值使用不可预测的随机值"加盐".虽然它们在单个Python进程中保持不变,但是在重复调用Python之间它们是不可预测的.
这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度.有关详细信息,请参见http://www.ocert.org/advisories/ocert-2011-003.html.
更改哈希值会影响dicts,集和其他映射的迭代顺序.Python从未对此排序做出保证(通常在32位和64位版本之间有所不同).
因此,从3.3开始hash()
甚至不能保证在相同Python版本的不同调用中返回相同的结果.
我不确定您要寻找的是什么,但是hashlib
如果您正在寻找一致的哈希,则可以随时使用。
>>> import hashlib
>>> t = ("values", "other")
>>> hashlib.sha256(str(t)).hexdigest()
'bc3ed71325acf1386b40aa762b661bb63bb72e6df9457b838a2ea93c95cc8f0c'
Run Code Online (Sandbox Code Playgroud)
要么:
>>> h = hashlib.sha256()
>>> for item in t:
... h.update(item)
...
>>> h.hexdigest()
'5e98df135627bc8d98250ca7e638aeb2ccf7981ce50ee16ce00d4f23efada068'
Run Code Online (Sandbox Code Playgroud)