【python進階】哈希算法(Hash)


一、定義

  Hash :散列,通過關於鍵值(key)的函數,將數據映射到內存存儲中一個位置來訪問。這個過程叫做Hash,這個映射函數稱做散列函數,存放記錄的數組稱做散列表(Hash Table),又叫哈希表。

 

  簡單地說,它是密碼學中的一個重要的函數,一般以Hash(.)表示。這個函數可以將任意一段數據(一般稱這段數據為“消息”)壓縮成固定長度的字符串(一般稱輸出的字符串為“摘要”)。哈希函數需要滿足下述條件:

    1、確定性:哈希函數的算法是確定性算法,算法執行過程不引入任何隨機量。這意味着相同消息的哈希結果一定相同。

    2、高效性:給定任意一個消息m,可以快速計算Hash(m)

    3、目標抗碰撞性:給定任意一個消息m0,很難找到另一個消息m1,使得 Hash(m0) = Hash(m1)

    4、廣義抗碰撞性:很難找到兩個消息m0不等於m1的情況下, 使得Hash(m0) = Hash(m1)

二、優點

  先分類,再查找,通過計算,縮小范圍,加快查找速度

三、作用

  1、數字簽名:給數據打指紋

  2、密碼存儲

四、特性 

  1、正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。

  2、逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。

  3、輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不同。

  4、沖突避免:很難找到兩段內容不同的明文,使得它們的 hash 值一致(發生沖突)。

五、hash算法 

  1、直接定值法:取Key或者Key的某個線性函數值為散列地址。

  2、數字分析法:需要知道Key的集合,並且Key的位數比地址位數多,選擇Key數字分布均勻的位。

Hash(Key) 取六位:
列數 : 1 (2) 3 (4) 5 (6) (7) 8 (9) 10 11 12 (13)
key1: 5 2 4 2 7 5 8 5 3 6 5 1 3
key2: 5 4 4 8 7 7 7 5 4 8 9 5 1
key3: 3 1 5 3 7 8 5 4 6 3 5 5 2
key4: 5 3 6 4 3 2 5 4 5 3 2 6 4
 
其中(2、4、6、7、9、13) 這6列數字無重復,分布較均勻,取此六列作為Hash(Key)的值。
Hash(Key1) :225833
Hash(Key2):487741
Hash(Key3):138562
Hash(Key4):342554  

  3、平方取中法:取Key平方值的中間幾位作為Hash地址。

  4、折疊法:將關鍵字分割成位數相同的幾部分(最后一部分的位數可以不同),然后 取這幾部分的疊加和(舍去進位)作為哈希地址。 當Key的位數較多的時候數字分布均勻適合采用這種方案.

  5、隨機數法:偽隨機探測再散列。

具體實現:建立一個偽隨機數發生器,Hash(Key) = random(Key). 以此偽隨機數作為哈希地址。

  6、除留余數法:取關鍵字被某個除數 p 求余,得到的作為散列地址。即 H(Key) = Key % p;

 


免責聲明!

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



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