【整理】hash算法原理及常見函數


簡介

       Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入,通過散列算法,變換成固定長度的輸出,該輸出就是散列值。
       散列表,它是基於快速存取的角度設計的,也是一種典型的“空間換時間”的做法。顧名思義,該數據結構可以理解為一個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。
       散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

 

hash函數的選擇

        哈稀函數按照定義可以實現一個偽隨機數生成器(PRNG),從這個角度可以得到一個公認的結論:哈希函數之間性能的比較可以通過比較其在偽隨機生成方面的比較來衡量。

       一般來說,對任意一類的數據存在一個理論上完美的哈希函數。這個完美的哈希函數定義是沒有發生任何碰撞,這意味着沒有出現重復的散列值。在現實中它很難找到一個完美的哈希散列函數,而且這種完美函數的趨近變種在實際應用中的作用是相當有限的。在實踐中人們普遍認識到,一個完美哈希的哈希函數,就是在一個特定的數據集上產生的的碰撞最少哈希的函數。
       我們所能做的就是通過試錯方法來找到滿足我們要求的哈希函數。可以從下面兩個角度來選擇哈希函數:
1.數據分布
       一個衡量的措施是考慮一個哈希函數是否能將一組數據的哈希值進行很好的分布。要進行這種分析,需要知道碰撞的哈希值的個數,如果用鏈表來處理碰撞,則可以分析鏈表的平均長度,也可以分析散列值的分組數目。
2.哈希函數的效率
       另個一個衡量的標准是哈希函數得到哈希值的效率。通常,包含哈希函數的算法的算法復雜度都假設為O(1),這就是為什么在哈希表中搜索數據的時間復雜度會被認為是"平均為O(1)的復雜度",而在另外一些常用的數據結構,比如圖(通常被實現為紅黑樹),則被認為是O(logn)的復雜度。
       一個好的哈希函數必須在理論上非常的快、穩定並且是可確定的。通常哈希函數不可能達到O(1)的復雜度,但是哈希函數在字符串哈希的線性的搜索中確實是非常快的,並且通常哈希函數的對象是較小的主鍵標識符,這樣整個過程應該是非常快的,並且在某種程度上是穩定的。
       在這篇文章中介紹的哈希函數被稱為簡單的哈希函數。它們通常用於散列(哈希字符串)數據。它們被用來產生一種在諸如哈希表的關聯容器使用的key。這些哈希函數不是密碼安全的,很容易通過顛倒和組合不同數據的方式產生完全相同的哈希值。

    
hash方法學

 

1.基於加法和乘法的散列
       這種方式是通過遍歷數據中的元素然后每次對某個初始值進行加操作,其中加的值和這個數據的一個元素相關。通常這對某個元素值的計算要乘以一個素數。

2.基於移位的散列
       和加法散列類似,基於移位的散列也要利用字符串數據中的每個元素,但是和加法不同的是,后者更多的而是進行位的移位操作。通常是結合了左移和右移,移的位數的也是一個素數。每個移位過程的結果只是增加了一些積累計算,最后移位的結果作為最終結果。


hash構造方法

       1. 直接尋址法:取關鍵字或關鍵字的某個線性函數值為散列地址。即H(key)=key或H(key) = a?key + b,其中a和b為常數(這種散列函數叫做自身函數)

  2. 數字分析法:分析一組數據,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現沖突的幾率就會很大,但是我們發現年月日的后幾位表示月份和具體日期的數字差別很大,如果用后面的數字來構成散列地址,則沖突的幾率會明顯降低。因此數字分析法就是找出數字的規律,盡可能利用這些數據來構造沖突幾率較低的散列地址。
  3. 平方取中法:取關鍵字平方后的中間幾位作為散列地址。
  4. 折疊法:將關鍵字分割成位數相同的幾部分,最后一部分位數可以不同,然后取這幾部分的疊加和(去除進位)作為散列地址。
  5. 隨機數法:選擇一隨機函數,取關鍵字的隨機值作為散列地址,通常用於關鍵字長度不同的場合。
  6. 除留余數法:取關鍵字被某個不大於散列表表長m的數p除后所得的余數為散列地址。即 H(key) = key MOD p, p<=m。不僅可以對關鍵字直接取模,也可在折疊、平方取中等運算之后取模。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。


hash沖突及解決

 

hash沖突在所難免,解決沖突是一個復雜問題。沖突主要取決於:
       (1)與散列函數有關,一個好的散列函數的值應盡可能平均分布。
       (2)與解決沖突的哈希沖突函數有關。
       (3)與負載因子的大小。太大不一定就好,而且浪費空間嚴重,負載因子和散列函數是聯動的。
解決沖突的辦法:
       (1)開放定址法:線性探查法、平方探查法、偽隨機序列法、雙哈希函數法。
       (2)拉鏈法:把所有同義詞,即hash值相同的記錄,用單鏈表連接起來。


哈希函數和素數

       沒有人可以證明素數和偽隨機數生成器之間的關系,但是目前來說最好的結果使用了素數。偽隨機數生成器現在是一個統計學上的東西,不是一個確定的實體,所以對其的分析只能對整個的結果有一些認識,而不能知道這些結果是怎么產生的。

       圍繞着哈希函數中的素數的使用的基本的概念是,利用一個素數來改變處理的哈希函數的狀態值,而不是使用其他類型的數。處理這個詞的意思就是對哈希值進行一些簡單的操作,比如乘法和加法。這樣得到的一個新的哈希值一定要在統計學上具有更高的熵,也就是說不能有為偏向。簡單的說,當你用一個素數去乘一堆隨機數的時候,得到的數在bit這個層次上是1的概率應該接近0.5。沒有具體的證明這種不便向的現象只出現在使用素數的情況下,這看上去只是一個自我宣稱的直覺上的理論,並被一些業內人士所遵循。
       決定什么是正確的,甚至更好的方法和對散列素數的使用最好的組合仍然是一個很有黑色藝術。沒有單一的方法可以宣稱自己是最終的通用散列函數。最好的一所能做的就是通過試錯演進和獲得適當的散列算法,以滿足其需要的統計分析方法。


應用領域

       哈希是一個在現實世界中將數據映射到一個標識符的工具,下面是哈希函數的一些常用領域:

1.字符串哈希
       在數據存儲領域,主要是數據的索引和對容器的結構化支持,比如哈希表。
2.加密哈希
       用於數據/用戶核查和驗證。一個強大的加密哈希函數很難從結果再得到原始數據。加密哈希函數用於哈希用戶的密碼,用來代替密碼本身存在某個服務器撒很難過。加密哈希函數也被視為不可逆的壓縮功能,能夠代表一個信號標識的大量數據,可以非常有用的判斷當前的數據是否已經被篡改(比如MD5),也可以作為一個數據標志使用,以證明了通過其他手段加密文件的真實性。
3.幾何哈希
       這個哈希表用於在計算機視覺領域,為在任意場景分類物體的探測。最初選擇的過程涉及一個地區或感興趣的對象。幾何散列包括各種汽車分類的重新檢測中任意場景的目的,典型的例子。檢測水平可以多種多樣,從剛檢測是否是車輛,到特定型號的車輛,在特定的某個車輛。
4.布隆過濾器
       布隆過濾器允許一個非常大范圍內的值被一個小很多的內存鎖代表。在計算機科學,這是眾所周知的關聯查詢,並在關聯容器的核心理念。
Bloom Filter的實現通過多種不同的hash函數使用,也可通過允許一個特定值的存在有一定的誤差概率會員查詢結果的。布隆過濾器的保證提供的是,對於任何會員國的查詢就永遠不會再有假陰性,但有可能是假陽性。假陽性的概率可以通過改變控制為布隆過濾器,並通過不同的hash函數的數量所使用的表的大小。
       隨后的研究工作集中在的散列函數和哈希表以及Mitzenmacher的布隆過濾器等領域。建議對這種結構,在數據被散列熵最實用的用法有助於哈希函數熵,這是理論成果上締結一項最佳的布隆過濾器(一個提供給定一個最低的進一步導致假陽性的可能性表的大小或反之亦然)提供假陽性的概率定義用戶可以建造最多也作為兩種截然不同的兩兩獨立的哈希散列函數已知功能,大大提高了查詢效率的成員。
布隆過濾器通常存在於諸如拼寫檢查器,字符串匹配算法,網絡數據包分析工具和網絡/ Internet緩存的應用程序。
5.Hash算法在信息安全方面的應用主要體現在以下的3個方面:
  (1) 文件校驗
  我們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗數據篡改的能力,它們一定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。
  MD5 Hash算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的命令。
  (2) 數字簽名
  Hash 算法也是現代密碼體系中的一個重要組成部分。由於非對稱算法的運算速度較慢,所以在數字簽名協議中,單向散列函數扮演了一個重要的角色。 對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。
  (3) 鑒權協議
  如下的鑒權協議又被稱作挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。


免責聲明!

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



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