Python2.6的内置hash方法在不同架构上稳定吗?

15 投票
4 回答
4238 浏览
提问于 2025-04-16 15:17

我需要计算一个哈希值,这个哈希值在不同的计算机架构上需要保持一致。请问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这个库。

撰写回答