python 的 hash() 是可移植的吗?

Is python's hash() portable?

python 的 hash 函数是可移植的吗?

"portable" 我的意思是,return 跨 python 个版本、平台和实现的结果是否相同(对于相同的数据)?

如果没有,是否有任何替代方案可以提供此类功能(同时仍然能够散列通用数据结构)?


The documentation 不是特别有用。 指的是一个似乎推出自己版本的库,但我不确定不可移植性是否是它的原因。

不,hash()不保证便携。

Python 3.3 还默认使用 哈希随机化 ,其中某些类型使用启动时选择的哈希种子进行哈希处理。 Python 解释器调用之间的哈希值不同。

来自object.__hash__() documenation

By default, the __hash__() values of str, bytes and datetime objects are “salted” with an unpredictable random value. Although they remain constant within an individual Python process, they are not predictable between repeated invocations of Python.

This is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a dict insertion, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details.

Changing hash values affects the iteration order of dicts, sets and other mappings. Python has never made guarantees about this ordering (and it typically varies between 32-bit and 64-bit builds).

See also PYTHONHASHSEED.

Python 2.6.8 和 3.2.3 及更新版本支持相同的功能,但通常禁用它。

Python 3.2 引入了一个 sys.hash_info named tuple,为您提供有关当前解释器的哈希实现的详细信息。

如果您需要一个可移植的哈希,有很多实现。标准库包括一个名为 hashlib; these implementations are definitely portable. Another option would be the mm3 package which provides Murmur3 non-cryptographic hash function implementations.

的加密哈希库

常见的数据结构需要先转换为字节;您可以为此使用序列化,例如 json or pickle 模块。