python' PLUGH$
功能是否可移植?
便携式"我的意思是,它会在python版本,平台和实现中返回相同的结果(对于相同的数据)吗?
如果没有,是否有任何替代它提供这样的功能(虽然仍然能够散列常见的数据结构)?
The documentation并不是特别有用。 This question指的是一个似乎推出自己版本的库,但我不确定不可移植性是什么原因。
答案 0 :(得分:3)
不,hash()
不保证可移植。
Python 3.3默认使用哈希随机化,其中某些类型使用启动时选择的哈希种子进行哈希处理。然后,Hash值在Python解释器调用之间不同。
来自object.__hash__()
documenation:
默认情况下,str,bytes和datetime对象的
__hash__()
值使用不可预测的随机值“加盐”。尽管它们在单个Python进程中保持不变,但在重复调用Python之间无法预测它们。这旨在提供针对由精心选择的输入引起的拒绝服务的保护,该输入利用dict插入的最坏情况性能,O(n ^ 2)复杂度。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html。
更改散列值会影响dicts,集和其他映射的迭代顺序。 Python从未对这种排序做出保证(通常在32位和64位版本之间有所不同)。
Python 2.6.8和3.2.3及更高版本支持相同的功能,但通常禁用它。
Python 3.2引入了一个sys.hash_info
named tuple,它为您提供了有关当前解释器的哈希实现的详细信息。
如果你需要一个可移植的哈希,那么有很多实现。标准库包括一个名为hashlib
的加密哈希库;这些实现绝对是可移植的。另一个选项是提供mm3
package的Murmur3 non-cryptographic hash function implementations。