保持唯一性,請停止使用【python3 內置hash() 函數】


問題:

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

https://blog.csdn.net/qq_38607035/article/details/82591931

https://www.cnblogs.com/yzhch/p/11855660.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM