我正在使用hash
在整數和字符串的元組(以及整數和字符串的嵌套元組等),以便計算一些對象的唯一性。除了可能存在散列衝突,我不知道 - 那些保證爲不同版本的Python返回相同結果的數據類型的hash
函數?從Python中的32位和64位版本之間的長期分歧除了python的散列函數在不同版本中保持相同嗎?
3
A
回答
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版本的不同調用中返回相同的結果。
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'
相關問題
- 1. Python MD5散列相同的內容返回不同的散列
- 2. 跨不同會話散列python函數
- 3. 增加版本但保持ProductCode相同?
- 4. Crypt函數爲相同的密碼生成相同的散列
- 5. 支持不同版本的Python
- 6. 相同的散列,不同的行爲
- 7. 表列不保持相同的寬度
- 8. Gemfile中的相同gem的不同版本 - 可能嗎?
- 9. 保持GridView列寬相同
- 10. sys.getsizeof()在不同的機器和相同的Python版本
- 11. 保持在不同的回購相同的文件在不同的版本控制系統
- 12. 在Python中爲不同的結果執行相同的函數
- 13. 保持顏色縮放相同的不同情節 - Python
- 14. Django在不同的Python版本中
- 15. 使用不同版本的相同庫
- 16. 在Python中綁定相同的函數
- 17. 具有不同名稱和相同內容的文件的散列函數
- 18. 不同版本的相同配置文件在不同分支
- 19. 相同的組件需要在Wix中的版本上有不同的GUID嗎?
- 20. nginx轉發後保持域相同嗎?
- 21. 這些是mgo的相同版本嗎?
- 22. 應用Data.table函數後保持列名相同
- 23. 不同版本的相同腳本與同一個python安裝的軟件包
- 24. 如何在不同版本中保持單個XPO?
- 25. CSS列保持相同的高度
- 26. 保持相同高度的列
- 27. 哈希函數,在相同的桶中散列相似的字符串
- 28. 不同了在Java相同的函數的Python
- 29. 在Python中的字典中保持相同的值
- 30. SHA將相同的字符串散列到不同的塊中
這將是我的答案了!謝謝,我會找到另一種方式。 – Claudiu 2013-05-09 00:32:46