簡體   English   中英

Python2.6的內置哈希方法是否跨架構穩定?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM