python的hash()是否可移植?

时间:2015-07-01 20:13:27

标签: python hash cross-platform portability

python' PLUGH$功能是否可移植?

便携式"我的意思是,它会在python版本,平台和实现中返回相同的结果(对于相同的数据)吗?

如果没有,是否有任何替代它提供这样的功能(虽然仍然能够散列常见的数据结构)?

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

1 个答案:

答案 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位版本之间有所不同)。

     

另见PYTHONHASHSEED

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

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

如果你需要一个可移植的哈希,那么有很多实现。标准库包括一个名为hashlib的加密哈希库;这些实现绝对是可移植的。另一个选项是提供mm3 packageMurmur3 non-cryptographic hash function implementations

首先需要将公共数据结构转换为字节;您可以使用序列化,例如jsonpickle模块。