問題:
如圖,用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