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