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

dan*_*iel 13 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
Run Code Online (Sandbox Code Playgroud)

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

nmi*_*els 11

如果你需要一个定义良好的哈希,你可以使用一个hashlib.


Eli*_*ins 7

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版本之间可能还有细微的差别......我肯定会建议你依赖的任何实现的单元测试.


Jim*_*imB 5

没有.

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

i386
>>> print hash("a")
-468864544
Run Code Online (Sandbox Code Playgroud)

如果您需要稳定的哈希,请使用sha1创建数据摘要,这可以在hashlib中找到


小智 5

在ARM上使用python 2.6:

>>> hash((1,2,3,4)) 
Run Code Online (Sandbox Code Playgroud)

89902565