Python2.6的内置哈希方法是否跨架构稳定?

时间:2011-04-07 15:51:40

标签: python

我需要计算需要在架构之间保持稳定的哈希值。 python的hash()是否稳定?

更具体地说,下面的示例显示hash()在两个不同的主机/体系结构上计算相同的值:

# on OSX based laptop
>>> hash((1,2,3,4))
485696759010151909
# on x86_64 Linux host
>>> hash((1,2,3,4))
485696759010151909

以上情况至少适用于那些输入,但我的问题是针对一般情况

4 个答案:

答案 0 :(得分:11)

如果您需要定义良好的哈希,可以使用hashlib中的一个。

答案 1 :(得分:6)

hash()功能不是你想要的;找到一种可靠的方法来序列化对象(例如str()repr())并通过hashlib.md5()运行它可能会更加优先。

详细信息 - hash()旨在返回一个整数,该整数仅在其生命周期内唯一标识对象 。一旦程序再次运行,构造新对象实际上可能具有不同的散列。销毁对象意味着将来有另一个对象将拥有该哈希。有关更多信息,请参阅python对hashable的定义。

在幕后,大多数用户定义的python对象都会回退到id()以提供其哈希值。虽然你不应该使用它,但id(obj)因此hash(obj)通常被实现(例如在CPython中)作为底层Python对象的内存地址。因此,你可以看出为什么它不能依赖于任何东西。

您目前看到的行为仅对某些内置python对象可靠,并且不是很远。例如hash({})是不可能的。


关于hashlib.md5(str(obj))或同等对象 - 您需要确保str(obj)可靠地相同。特别是,如果您在该字符串中有字典呈现,它可能不会以相同的顺序列出它的键。 python版本之间可能还有细微的差别......我肯定会建议你依赖的任何实现的单元测试。

答案 2 :(得分:5)

没有

x86_64
>>> print hash("a")
12416037344

i386
>>> print hash("a")
-468864544

如果您需要稳定的哈希,请使用sha1之类的内容创建数据摘要,可以在hashlib

中找到

答案 3 :(得分:5)

没有。在ARM上使用python 2.6:

>>> hash((1,2,3,4)) 

89902565