[英]Is the builtin hash method of Python2.6 stable across architectures?
我需要计算一个需要在架构之间保持稳定的哈希。 python的hash()是否稳定?
更具体地说,下面的示例显示了hash()在两个不同的主机/体系结构上计算相同的值:
# on OSX based laptop
>>> hash((1,2,3,4))
485696759010151909
# on x86_64 Linux host
>>> hash((1,2,3,4))
485696759010151909
以上情况至少适用于那些输入,但我的问题是针对一般情况
如果你需要一个定义良好的哈希,你可以使用一个hashlib 。
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版本之间可能还有细微的差别......我肯定会建议你依赖的任何实现的单元测试。
没有。
x86_64
>>> print hash("a")
12416037344
i386
>>> print hash("a")
-468864544
如果您需要稳定的哈希,请使用sha1创建数据摘要,这可以在hashlib中找到
在ARM上使用python 2.6:
>>> hash((1,2,3,4))
89902565
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.