2011-04-07 17 views
12

我需要计算一个需要在整个架构中保持稳定的散列。 python的hash()是稳定的吗?Python2.6的内置哈希方法在架构上稳定吗?

更具体而言,下面的例子中示出的散列()计算在两个不同的主机/结构相同的值:

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

至少这些输入上述是真实的,但我的问题是为一般情况下

回答

11

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

+0

为此,您需要一个稳定的'str',我相信这是真的。 – kennytm 2011-04-07 16:02:46

+0

@KennyTM:是的,'str()'的结果应该在平台和实现中相同。 – nmichaels 2011-04-07 16:04:23

+0

这就是我的想法,也一样简单。谢谢 – daniel 2011-04-07 19:37:02

5

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

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

如果你需要一个稳定的哈希值,创建使用像SHA1您的数据,可以在发现的摘要10

5

号在ARM与Python 2.6:

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

89902565

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版本之间也可能存在细微的差异......我肯定会推荐你所依赖的任何实现的单元测试。

+0

第二段可以真正使用参考。有这些信息的官方文档吗? – phihag 2013-05-02 20:46:53

+0

@phihag几乎所有的第二和第三段只是在段落内部链接的官方'hashable'和'id()'文档中的信息的重述;尽管官方文档可以使事情变得更好一些。 – 2013-05-03 03:58:21

+0

它不能唯一标识一个对象。它只提供一个良好分布的int域映射。碰撞是不可避免的并且被关心。 – sleeplessnerd 2014-09-08 20:41:53