Python2.6的内置hash方法在不同架构上稳定吗?
我需要计算一个哈希值,这个哈希值在不同的计算机架构上需要保持一致。请问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 个回答
6
不。
x86_64
>>> print hash("a")
12416037344
i386
>>> print hash("a")
-468864544
如果你需要一个稳定的哈希值,可以使用像 sha1 这样的方式来处理你的数据,sha1 可以在 hashlib 这个库里找到。
9
hash()
这个函数可能不是你想要的。找到一种可靠的方法来序列化对象(比如用str()
或repr()
),然后通过hashlib.md5()
来处理,这样可能会更好。
具体来说,hash()
是用来返回一个整数,这个整数在对象的生命周期内是唯一的。也就是说,当程序再次运行时,创建的新对象可能会有不同的哈希值。销毁一个对象后,未来可能会有其他对象使用到这个哈希值。想了解更多,可以查看Python对可哈希对象的定义。
在后台,大多数用户自定义的Python对象会退回到id()
来提供它们的哈希值。虽然你不应该依赖这个,id(obj)
和hash(obj)
通常在CPython中是实现为底层Python对象的内存地址。因此,你可以理解为什么它不能被可靠地使用。
你现在看到的行为只对某些内置的Python对象是可靠的,而且范围也不大。比如,hash({})
是不可行的。
关于hashlib.md5(str(obj))
或类似的用法,你需要确保str(obj)
是可靠的一致的。特别是,如果你有一个字典在这个字符串中,它的键可能不会按相同的顺序列出。不同版本的Python之间也可能会有细微的差别……我强烈建议你为任何依赖的实现编写单元测试。
12
如果你需要一个明确的哈希值,可以使用hashlib这个库。