2015-12-03 48 views
5

我正在練習元組哈希。在那裏我正在研究Python 2.7。下面是代碼:在Python中哈希元組導致不同系統中的不同結果

num = int(raw_input()) 
num_list = [int(x) for x in raw_input().split()] 
print(hash(tuple(num_list))) 

上面的代碼導致

>>> 2 
>>> 1 2 
>>> 3713081631934410656 

但在我的本地PC,我使用其中的Python 3.4的答覆是

>>> 1299869600 

的代碼被接受,但我無法找出導致不同結果的原因。這是用於不同版本的Python嗎?

+0

我試着用不同的機器上的許多不同的2.x版本的散列。它顯示了相同的結果。雖然不同版本的python3.x顯示不同的結果。 –

回答

1

hash()可能爲不同的操作系統,體系結構,Python實現和Python版本上的同一對象返回不同的值。

它被設計爲僅在單個Python會話中使用,而不是跨會話或機器使用。因此,除此之外,您絕不應該依賴hash()的值。

如果您需要哈希能產生相同的結果無處不在,考慮校驗如:

  • MD5或SHA-1,
  • xxHash其中每它的作者提供跨多個操作系統和架構穩定的結果,無論是小或大端,32/64位,posix與否等)
  • 或謹慎小心某些版本可能在不同的體系結構上產生不同的結果。例如,當我將C Murmur2移植到IBM S390 Linux安裝(所有奇怪的地方!)時,我經歷了這一拳頭。爲了避免出現問題,我終於在該OS上編寫了一個緩慢而獨立於腳本的純Python實現,而不是C實現。
+1

簡評xxHash是不正確的:結果是跨多個不同的操作系統和架構穩定,無論是很少或大端,32/64位,POSIX與否等 – Cyan

+1

@cyan你是正確的,並具有xxHash的作者,我必須感謝你在++中提到:我在過去碰到了排序問題時,「加了一些小心」。舉例來說,當我將C Murmur移植到IBM S390 Linux安裝(所有奇怪的地方!)時,我經歷了這一拳頭。爲了避免出現問題,我終於在該OS上編寫了一個緩慢而獨立於腳本的純Python實現,而不是C實現。 –

相關問題