python的hash()可移植吗?

gon*_*opp 5 python hash portability cross-platform

python的hash函数可移植吗?

我所说的“可移植”是指,它会在Python版本、平台和实现中返回相同的结果(对于相同的数据)吗?

如果没有,是否有任何替代方案可以提供此类功能(同时仍然能够对常见数据结构进行哈希处理)?


该文档并不是特别有帮助。 这个问题指的是一个似乎推出自己版本的库,但我不确定不可移植性是其原因。

Mar*_*ers 4

不,hash()不保证便携。

\n\n

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

\n\n

object.__hash__()文档中

\n\n
\n

默认情况下,__hash__()str、bytes 和 datetime 对象的值为 \xe2\x80\x9csalted\xe2\x80\x9d ,具有不可预测的随机值。尽管它们在单个 Python 进程中保持不变,但在 Python 的重复调用之间它们是不可预测的。

\n\n

这是为了防止由于精心选择的输入而导致拒绝服务,这些输入利用了字典插入的最坏情况性能,复杂度为 O(n^2)。有关详细信息,请参阅http://www.ocert.org/advisories/ocert-2011-003.html

\n\n

更改哈希值会影响字典、集合和其他映射的迭代顺序。Python 从未对这种顺序做出保证(并且它通常在 32 位和 64 位版本之间变化)。

\n\n

另请参见PYTHONHASHSEED

\n
\n\n

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

\n\n

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

\n\n

如果您需要可移植的哈希,有很多实现。标准库包括一个名为 的加密哈希库hashlib;这些实现绝对是可移植的。另一种选择是提供Murmur3 非加密哈希函数实现的mm3

\n\n

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

\n