我需要计算一个需要在架构之间保持稳定的哈希.python的hash()是否稳定?
更具体地说,下面的示例显示了hash()在两个不同的主机/体系结构上计算相同的值:
# on OSX based laptop
>>> hash((1,2,3,4))
485696759010151909
# on x86_64 Linux host
>>> hash((1,2,3,4))
485696759010151909
Run Code Online (Sandbox Code Playgroud)
以上情况至少适用于那些输入,但我的问题是针对一般情况
该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
Run Code Online (Sandbox Code Playgroud)
如果您需要稳定的哈希,请使用sha1创建数据摘要,这可以在hashlib中找到