2011-04-07 20 views
12

我需要計算一個需要在整個架構中保持穩定的散列。 python的hash()是穩定的嗎?Python2.6的內置哈希方法在架構上穩定嗎?

更具體而言,下面的例子中示出的散列()計算在兩個不同的主機/結構相同的值:

# on OSX based laptop 
>>> hash((1,2,3,4)) 
485696759010151909 
# on x86_64 Linux host 
>>> hash((1,2,3,4)) 
485696759010151909 

至少這些輸入上述是真實的,但我的問題是爲一般情況下

回答

11

如果你需要一個定義良好的哈希值,你可以用一個出hashlib

+0

爲此,您需要一個穩定的'str',我相信這是真的。 – kennytm 2011-04-07 16:02:46

+0

@KennyTM:是的,'str()'的結果應該在平臺和實現中相同。 – nmichaels 2011-04-07 16:04:23

+0

這就是我的想法,也一樣簡單。謝謝 – daniel 2011-04-07 19:37:02

5

x86_64 
>>> print hash("a") 
12416037344 

i386 
>>> print hash("a") 
-468864544 

如果你需要一個穩定的哈希值,創建使用像SHA1您的數據,可以在發現的摘要10

5

號在ARM與Python 2.6:

>>> hash((1,2,3,4)) 

89902565

6

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版本之間也可能存在細微的差異......我肯定會推薦你所依賴的任何實現的單元測試。

+0

第二段可以真正使用參考。有這些信息的官方文檔嗎? – phihag 2013-05-02 20:46:53

+0

@phihag幾乎所有的第二和第三段只是在段落內部鏈接的官方'hashable'和'id()'文檔中的信息的重述;儘管官方文檔可以使事情變得更好一些。 – 2013-05-03 03:58:21

+0

它不能唯一標識一個對象。它只提供一個良好分佈的int域映射。碰撞是不可避免的並且被關心。 – sleeplessnerd 2014-09-08 20:41:53