2013-05-09 62 views
3

我正在使用hash在整數和字符串的元組(以及整數和字符串的嵌套元組等),以便計算一些對象的唯一性。除了可能存在散列衝突,我不知道 - 那些保證爲不同版本的Python返回相同結果的數據類型的hash函數?從Python中的32位和64位版本之間的長期分歧除了python的散列函數在不同版本中保持相同嗎?

回答

6

號,散列算法was changed in Python 3.3以解決安全問題:

默認情況下,哈希()的值str,bytes和datetime對象被一個不可預知的隨機值「鹽化」。雖然它們在單獨的Python過程中保持不變,但在重複調用Python之間它們是不可預測的。

這是爲了防止由精心挑選的輸入引起的拒絕服務,這些輸入利用了dict插入的最壞情況性能,O(n^2)複雜度。詳情請參閱http://www.ocert.org/advisories/ocert-2011-003.html

更改散列值會影響字典,集合和其他映射的迭代順序。 Python從來沒有對這個順序做過保證(它通常在32位和64位版本之間變化)。

因此,從3.3開始hash()甚至不能保證在同一個Python版本的不同調用中返回相同的結果。

+0

這將是我的答案了!謝謝,我會找到另一種方式。 – Claudiu 2013-05-09 00:32:46

3

編號例如:

32位

Python 2.7.3 (default, Aug 1 2012, 05:16:07) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> hash("foobar") 
-1969371895 

64位

Python 2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> hash("foobar") 
3433925302934160649 
3

我不知道你在找什麼,但你可以隨時使用hashlib如果你正在尋找一致的哈希值。

>>> import hashlib 
>>> t = ("values", "other") 
>>> hashlib.sha256(str(t)).hexdigest() 
'bc3ed71325acf1386b40aa762b661bb63bb72e6df9457b838a2ea93c95cc8f0c' 

OR:

>>> h = hashlib.sha256() 
>>> for item in t: 
...  h.update(item) 
... 
>>> h.hexdigest() 
'5e98df135627bc8d98250ca7e638aeb2ccf7981ce50ee16ce00d4f23efada068'