保持唯一性,請停止使用【python3 內建hash() 函式】
阿新 • • 發佈:2020-06-29
問題:
如圖,用hash() 篩重時竟然出現了重複。
如下圖:
hash字串時,同一視窗的是一致的,不同視窗結果竟然不同。
原因:
python的字串hash演算法並不是直接遍歷字串每個字元去計算hash,而是會有一個secret prefix和一個secret suffix,可以認為相當於是給字串加鹽後做hash,可以規避一些規律輸入的情況。
這個內建hash函式帶有隨機magic的功能有一定的安全性上的考慮,可以讓攻擊者難以預測內建的set或者dict的一些行為,但遠不足以承擔真正的密碼安全級別的hash的作用。傳遞set和dict到其他程序的時候,只會傳遞其中的值,而不會傳遞hash表結構,hash表是傳到之後重新建立起來的。比如set/dict的hash確實是這玩意實現的,它只保證了在同一個直譯器程序裡相同字串hash一致。
解決:
真需要做可重現可跨程序保持一致性的hash,請用請用hashlib的md5摘要演算法。
基本使用:
import hashlib data = 'U.S. Army Sponsors First HIV Vaccine Trial to Show Some Effectiveness in Preventing HIV' hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
詳見廖老師部落格:https://www.liaoxuefeng.com/wiki/1016959663602400/1017686752491744
參考:
https://www.zhihu.com/question/57526436
https://www.liaoxuefeng.com/wiki/1016959663602400/1017686752491744