常見的hash演算法及其原理

2021-10-01 05:37:16 字數 2541 閱讀 6625

雜湊表和完美雜湊

這個部落格我更喜歡

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

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

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

比如我們儲存70個元素,但我們可能為這70個元素申請了100個元素的空間。70/100=0.7,這個數字稱為負載因子。我們之所以這樣做,也是為了「快速訪問」的目的。我們基於一種結果盡可能隨機平均分布的固定函式h為每個元素安排儲存位置,這樣就可以避免遍歷性質的線性搜尋,以達到快速訪問。但是由於此隨機性,也必然導致乙個問題就是衝突。所謂衝突,即兩個元素通過雜湊函式h得到的位址相同,那麼這兩個元素稱為「同義詞」。這類似於70個人去乙個有100個椅子的飯店吃飯。雜湊函式的計算結果是乙個儲存單位位址,每個儲存單位稱為「桶」。設乙個雜湊表有m個桶,則雜湊函式的值域應為[0,m-1]。

解決衝突是乙個複雜問題。

衝突主要取決於:

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

(2)處理衝突方法。

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

解決衝突的辦法:

(1)線性探查法:衝突後,線性向前試探,找到最近的乙個空位置。缺點是會出現堆積現象。訪問時,可能不是同義詞的詞也位於探查序列,影響效率。

(2)雙雜湊函式法:在位置d衝突後,再次使用另乙個雜湊函式產生乙個與雜湊表桶容量m互質的數c,依次試探(d+n*c)%m,使探查序列跳躍式分布。

常用的構造雜湊函式的方法

雜湊函式能使對乙個資料序列的訪問過程更加迅速有效,通過雜湊函式,資料元素將被更快地定位:

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

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

查詢的效能分析

雜湊表的查詢過程基本上和造表過程相同。一些關鍵碼可通過雜湊函式轉換的位址直接找到,另一些關鍵碼在雜湊函式得到的位址上產生了衝突,需要按處理衝突的方法進行查詢。在介紹的三種處理衝突的方法中,產生衝突後的查詢仍然是給定值與關鍵碼進行比較的過程。所以,對雜湊表查詢效率的量度,依然用平均查詢長度來衡量。

查詢過程中,關鍵碼的比較次數,取決於產生衝突的多少,產生的衝突少,查詢效率就高,產生的衝突多,查詢效率就低。因此,影響產生衝突多少的因素,也就是影響查詢效率的因素。影響產生衝突多少有以下三個因素:

1. 雜湊函式是否均勻;

2. 處理衝突的方法;

3. 雜湊表的裝填因子。

雜湊表的裝填因子定義為:α= 填入表中的元素個數 / 雜湊表的長度

α是雜湊表裝滿程度的標誌因子。由於表長是定值,α與「填入表中的元素個數」成正比,所以,α越大,填入表中的元素較多,產生衝突的可能性就越大;α越小,填入表中的元素較少,產生衝突的可能性就越小。

實際上,雜湊表的平均查詢長度是裝填因子α的函式,只是不同處理衝突的方法有不同的函式。

對於動態查詢表而言,1) 表長不確定;2)在設計查詢表時,只知道關鍵字所屬範圍,而不知道確切的關鍵字。因此,一般情況需建立乙個函式關係,以f(key)作為關鍵字為key的錄在表中的位置,通常稱這個函式f(key)為雜湊函式。(注意:這個函式並不一定是數學函式)

現實中雜湊函式是需要構造的,並且構造的好才能使用的好。

實際中的hash函式是指把乙個大範圍對映到乙個小範圍。把大範圍對映到乙個小範圍的目的往往是為了節省空間,使得資料容易儲存。除此以外,hash函式往往應用於查詢上。所以,在考慮使用hash函式之前,需要明白它的幾個限制:

1. hash的主要原理就是把大範圍對映到小範圍;所以,你輸入的實際值的個數必須和小範圍相當或者比它更小。不然衝突就會很多。

2. 由於hash逼近單向函式;所以,你可以用它來對資料進行加密。

3. 不同的應用對hash函式有著不同的要求;比如,用於加密的hash函式主要考慮它和單項函式的差距,而用於查詢的hash函式主要考慮它對映到小範圍的衝突率。

常見hash演算法的原理

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

hash演算法原理及常見函式

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。雜湊表,它是基於快速訪問的角度設計的,也是一種典型的 空間換時間 的做法。顧名思義,該資料結構可以理解為乙個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。雜湊...

經典的hash演算法 常見hash 雜湊演算法

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