繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM