hash演算法原理及常見函式

2022-08-17 09:27:11 字數 3942 閱讀 9102

hash,一般翻譯做「雜湊」,也有直接音譯為「雜湊」的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。

雜湊表,它是基於快速訪問的角度設計的,也是一種典型的「空間換時間」的做法。顧名思義,該資料結構可以理解為乙個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

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

一般來說,對任意一類的資料存在乙個理論上完美的雜湊函式。這個完美的雜湊函式定義是沒有發生任何碰撞,這意味著沒有出現重複的雜湊值。在現實中它很難找到乙個完美的雜湊雜湊函式,而且這種完美函式的趨近變種在實際應用中的作用是相當有限的。在實踐中人們普遍認識到,乙個完美雜湊的雜湊函式,就是在乙個特定的資料集上產生的的碰撞最少雜湊的函式。

我們所能做的就是通過試錯方法來找到滿足我們要求的雜湊函式。可以從下面兩個角度來選擇雜湊函式:

資料分布

乙個衡量的措施是考慮乙個雜湊函式是否能將一組資料的雜湊值進行很好的分布。要進行這種分析,需要知道碰撞的雜湊值的個數,如果用鍊錶來處理碰撞,則可以分析鍊錶的平均長度,也可以分析雜湊值的分組數目。

雜湊函式的效率

另個乙個衡量的標準是雜湊函式得到雜湊值的效率。通常,包含雜湊函式的演算法的演算法複雜度都假設為o(1),這就是為什麼在雜湊表中搜尋資料的時間複雜度會被認為是"平均為o(1)的複雜度",而在另外一些常用的資料結構,比如圖(通常被實現為紅黑樹),則被認為是o(logn)的複雜度。

乙個好的雜湊函式必須在理論上非常的快、穩定並且是可確定的。通常雜湊函式不可能達到o(1)的複雜度,但是雜湊函式在字串雜湊的線性的搜尋中確實是非常快的,並且通常雜湊函式的物件是較小的主鍵識別符號,這樣整個過程應該是非常快的,並且在某種程度上是穩定的。

在這篇文章中介紹的雜湊函式被稱為簡單的雜湊函式。它們通常用於雜湊(雜湊字串)資料。它們被用來產生一種在諸如雜湊表的關聯容器使用的key。這些雜湊函式不是密碼安全的,很容易通過顛倒和組合不同資料的方式產生完全相同的雜湊值。

基於加法和乘法的雜湊

這種方式是通過遍歷資料中的元素然後每次對某個初始值進行加操作,其中加的值和這個資料的乙個元素相關。通常這對某個元素值的計算要乘以乙個素數。

基於移位的雜湊

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

數字分析法:分析一組資料,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成雜湊位址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址。

除留餘數法:取關鍵字被某個不大於雜湊表表長m的數p除后所得的餘數為雜湊位址。即 h(key) = key mod p, p<=m。不僅可以對關鍵字直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。

hash衝突在所難免,解決衝突是乙個複雜問題。衝突主要取決於:

(1) 與雜湊函式有關,乙個好的雜湊函式的值應盡可能平均分布。

(2) 與解決衝突的雜湊衝突函式有關。

(3) 與負載因子的大小。太大不一定就好,而且浪費空間嚴重,負載因子和雜湊函式是聯動的。

解決衝突的辦法:

(1) 開放定址法:線性探查法、平方探查法、偽隨機序列法、雙雜湊函式法。

(2) 拉鍊法:把所有同義詞,即hash值相同的記錄,用單鏈表連線起來。

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

圍繞著雜湊函式中的素數的使用的基本的概念是,利用乙個素數來改變處理的雜湊函式的狀態值,而不是使用其他型別的數。處理這個詞的意思就是對雜湊值進行一些簡單的操作,比如乘法和加法。這樣得到的乙個新的雜湊值一定要在統計學上具有更高的熵,也就是說不能有為偏向。簡單的說,當你用乙個素數去乘一堆隨機數的時候,得到的數在bit這個層次上是1的概率應該接近0.5。沒有具體的證明這種不便向的現象只出現在使用素數的情況下,這看上去只是乙個自我宣稱的直覺上的理論,並被一些業內人士所遵循。

決定什麼是正確的,甚至更好的方法和對雜湊素數的使用最好的組合仍然是乙個很有黑色藝術。沒有單一的方法可以宣稱自己是最終的通用雜湊函式。最好的一所能做的就是通過試錯演進和獲得適當的雜湊演算法,以滿足其需要的統計分析方法。

雜湊是乙個在現實世界中將資料對映到乙個識別符號的工具,下面是雜湊函式的一些常用領域:

字串雜湊

在資料儲存領域,主要是資料的索引和對容器的結構化支援,比如雜湊表。

加密雜湊

用於資料/使用者核查和驗證。乙個強大的加密雜湊函式很難從結果再得到原始資料。加密雜湊函式用於雜湊使用者的密碼,用來代替密碼本身存在某個伺服器撒很難過。加密雜湊函式也被視為不可逆的壓縮功能,能夠代表乙個訊號標識的大量資料,可以非常有用的判斷當前的資料是否已經被篡改(比如md5),也可以作為乙個資料標誌使用,以證明了通過其他手段加密檔案的真實性。

幾何雜湊

這個雜湊表用於在計算機視覺領域,為在任意場景分類物體的探測。最初選擇的過程涉及乙個地區或感興趣的物件。幾何雜湊包括各種汽車分類的重新檢測中任意場景的目的,典型的例子。檢測水平可以多種多樣,從剛檢測是否是車輛,到特定型號的車輛,在特定的某個車輛。

布隆過濾器

布隆過濾器允許乙個非常大範圍內的值被乙個小很多的記憶體鎖代表。在電腦科學,這是眾所周知的關聯查詢,並在關聯容器的核心理念。

bloom filter的實現通過多種不同的hash函式使用,也可通過允許乙個特定值的存在有一定的誤差概率會員查詢結果的。布隆過濾器的保證提供的是,對於任何會員國的查詢就永遠不會再有假陰性,但有可能是假陽性。假陽性的概率可以通過改變控制為布隆過濾器,並通過不同的hash函式的數量所使用的表的大小。

隨後的研究工作集中在的雜湊函式和雜湊表以及mitzenmacher的布隆過濾器等領域。建議對這種結構,在資料被雜湊熵最實用的用法有助於雜湊函式熵,這是理論成果上締結一項最佳的布隆過濾器(乙個提供給定乙個最低的進一步導致假陽性的可能性表的大小或反之亦然)提供假陽性的概率定義使用者可以建造最多也作為兩種截然不同的兩兩獨立的雜湊雜湊函式已知功能,大大提高了查詢效率的成員。

布隆過濾器通常存在於諸如拼寫檢查器,字串匹配演算法,網路資料報分析工具和網路/ internet快取的應用程式。

hash演算法在資訊保安方面的應用主要體現在以下的3個方面:

(1) 檔案校驗

我們比較熟悉的校驗演算法有奇偶校驗和crc校驗,這2種校驗並沒有抗資料篡改的能力,它們一定程度上能檢測並糾正資料傳輸中的通道誤碼,但卻不能防止對資料的惡意破壞。

md5 hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種檔案完整性校驗和(checksum)演算法,不少unix系統有提供計算md5 checksum的命令。

(2) 數字簽名

hash 演算法也是現代密碼體系中的乙個重要組成部分。由於非對稱演算法的運算速度較慢,所以在數字簽名協議中,單向雜湊函式扮演了乙個重要的角色。 對 hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對檔案本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。

(3) 鑑權協議

如下的鑑權協議又被稱作挑戰--認證模式:在傳輸通道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。

常見hash演算法的原理

分類 演算法和資料結構 2011 11 22 13 12 1579人閱讀收藏 舉報雜湊表,它是基於快速訪問的角度設計的,也是一種典型的 空間換時間 的做法。顧名思義,該資料結構可以理解為乙個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。雜湊表 hash table,也叫雜湊表 是根據關鍵碼...

常見的hash演算法及其原理

雜湊表和完美雜湊 這個部落格我更喜歡 簡單解釋 雜湊 hash 演算法,即雜湊函式。它是一種單向密碼體制,即它是乙個從明文到密文的不可逆的對映,只有加密過程,沒有解密過程。同時,雜湊函式可以將任意長度的輸入經過變化以後得到固定長度的輸出。雜湊函式的這種單向特徵和輸出資料長度固定的特徵使得它可以生成訊...

幾種常用hash演算法及原理

計算理論中,沒有hash函式的說法,只有單向函式的說法。所謂的單向函式,是乙個複雜的定義,大家可以去看計算理論或者密碼學方面的資料。用 人 類 的語言描述單向函式就是 如果某個函式在給定輸入的時候,很容易計算出其結果來 而當給定結果的時候,很難計算出輸入來,這就是單項函式。各種加密函 數都可以被認為...