1. 程式人生 > 實用技巧 >保持唯一性,請停止使用【python3 內建hash() 函式】

保持唯一性,請停止使用【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