動畫 什麼是雜湊表?

2021-09-11 06:06:42 字數 4448 閱讀 2525

雜湊表雜湊表(hash table,也叫雜湊表),是根據鍵(key)而直接訪問在記憶體儲存位置的資料結構。也就是說,它通過計算乙個關於鍵值的函式,將所需查詢的資料對映到表中乙個位置來訪問記錄,這加快了查詢速度。這個對映函式稱做雜湊函式,存放記錄的陣列稱做雜湊表。

雜湊函式

雜湊函式,顧名思義,它是乙個函式。如果把它定義成hash(key),其中 key 表示元素的鍵值,則hash(key)的值表示經過雜湊函式計算得到的雜湊值。

雜湊函式的特點:

1.確定性

如果兩個雜湊值是不相同的(根據同一函式),那麼這兩個雜湊值的原始輸入也是不相同的。

2.雜湊碰撞(collision)

雜湊函式的輸入和輸出不是唯一對應關係的,如果兩個雜湊值相同,兩個輸入值很可能是相同的,但也可能不同。

3.不可逆性

乙個雜湊值對應無數個明文,理論上你並不知道哪個是。

「船長,如果一樣東西你知道在**,還算不算丟了。」

「不算。」

「好的,那您的酒壺沒有丟。」

4.混淆特性

輸入一些資料計算出雜湊值,然後部分改變輸入值,乙個具有強混淆特性的雜湊函式會產生乙個完全不同的雜湊值。

常見的雜湊函式1. md5

md5即 message-digest algorithm 5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。是計算機廣泛使用的雜湊演算法之一,主流程式語言普遍已有md5實現。

將資料(如漢字)運算為另一固定長度值,是雜湊演算法的基礎原理,md5的前身有 md2 、md3 和 md4 。

md5是輸入不定長度資訊,輸出固定長度 128-bits 的演算法。經過程式流程,生成四個32位資料,最後聯合起來成為乙個 128-bits 雜湊。

基本方式為,求餘、取餘、調整長度、與鏈結變數進行迴圈運算,得出結果。

md5 校驗2. sha-1

sha-1(英語:secure hash algorithm 1,中文名:安全雜湊演算法1)是一種密碼雜湊函式,sha-1可以生成乙個被稱為訊息摘要的160位(20位元組)雜湊值,雜湊值通常的呈現形式為40個十六進製制數。

sha-1 曾經在許多安全協議中廣為使用,包括tls和ssl、pgp、ssh、s/mime和ipsec,曾被視為是md5的後繼者。

雜湊衝突

理想中的乙個雜湊函式,希望達到

如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)

這種效果,然而在真實的情況下,要想找到乙個不同的 key 對應的雜湊值都不一樣的雜湊函式,幾乎是不可能的,即使是md5或者 由美國****局設計的sha-1演算法也無法實現。

事實上,再好的雜湊函式都無法避免雜湊衝突。

為什麼呢?

這涉及到數學中比較好理解的乙個原理:抽屜原理。

抽屜原理:桌上有十個蘋果,要把這十個蘋果放到九個抽屜裡,無論怎樣放,我們會發現至少會有乙個抽屜裡面至少放兩個蘋果。這一現象就是我們所說的「抽屜原理」。

抽屜原理

對於雜湊表而言,無論設定的儲存區域(n)有多大,當需要儲存的資料大於 n 時,那麼必然會存在雜湊值相同的情況。這就是所謂的雜湊衝突

雜湊衝突

那應該如何解決雜湊衝突問題呢?

常用的雜湊衝突解決方法有兩類,開放定址法(open addressing)和鍊錶法(chaining)。

開放定址法

定義:將雜湊函式擴充套件定義成探查序列,即每個關鍵字有乙個探查序列h(k,0)、h(k,1)、…、h(k,m-1),這個探查序列一定是0….m-1的乙個排列(一定要包含雜湊表全部的下標,不然可能會發生雖然雜湊表沒滿,但是元素不能插入的情況),如果給定乙個關鍵字k,首先會看h(k,0)是否為空,如果為空,則插入;如果不為空,則看h(k,1)是否為空,以此類推。

開放定址法是一種解決碰撞的方法,對於開放定址衝突解決方法,比較經典的有線性探測方法(linear probing)、二次探測(quadratic probing)和 雙重雜湊(double hashing)等方法。

線性探測方法

開放定址法之線性探測方法

當我們往雜湊表中插入資料時,如果某個資料經過雜湊函式雜湊之後,儲存位置已經被占用了,我們就從當前位置開始,依次往後查詢,看是否有空閒位置,直到找到為止。

以上圖為例,雜湊表的大小為 8 ,黃色區域表示空閒位置,橙色區域表示已經儲存了資料。目前雜湊表中已經儲存了 4 個元素。此時元素 7777777 經過 hash 演算法之後,被雜湊到位置下標為 7 的位置,但是這個位置已經有資料了,所以就產生了衝突。

於是按順序地往後乙個乙個找,看有沒有空閒的位置,此時,運氣很好正巧在下乙個位置就有空閒位置,將其插入,完成了資料儲存。

線性探測法乙個很大的弊端就是當雜湊表中插入的資料越來越多時,雜湊衝突發生的可能性就會越來越大,空閒位置會越來越少,線性探測的時間就會越來越久。極端情況下,需要從頭到尾探測整個雜湊表,所以最壞情況下的時間複雜度為 o(n)。

開放定址法之線性探測方法的弊端

二次探測方法

二次探測是二次方探測法的簡稱。顧名思義,使用二次探測進行探測的步長變成了原來的「二次方」,也就是說,它探測的下標序列為 hash(key)+0,hash(key)+1^2或[hash(key)-1^2],hash(key)+2^2或[hash(key)-2^2]。

二次探測方法

以上圖為例,雜湊表的大小為 8 ,黃色區域表示空閒位置,橙色區域表示已經儲存了資料。目前雜湊表中已經儲存了 7 個元素。此時元素 7777777 經過 hash 演算法之後,被雜湊到位置下標為 7 的位置,但是這個位置已經有資料了,所以就產生了衝突。

按照二次探測方法的操作,有衝突就先 + 1^2,8 這個位置有值,衝突;變為 - 1^2,6 這個位置有值,還是有衝突;於是 - 2^2, 3 這個位置是空閒的,插入。

雙重雜湊方法

所謂雙重雜湊,意思就是不僅要使用乙個雜湊函式,而是使用一組雜湊函式 hash1(key),hash2(key),hash3(key)。。。。。。先用第乙個雜湊函式,如果計算得到的儲存位置已經被占用,再用第二個雜湊函式,依次類推,直到找到空閒的儲存位置。

雙重雜湊方法

以上圖為例,雜湊表的大小為 8 ,黃色區域表示空閒位置,橙色區域表示已經儲存了資料。目前雜湊表中已經儲存了 7 個元素。此時元素 7777777 經過 hash 演算法之後,被雜湊到位置下標為 7 的位置,但是這個位置已經有資料了,所以就產生了衝突。

此時,再將資料進行一次雜湊演算法處理,經過另外的 hash 演算法之後,被雜湊到位置下標為 3 的位置,完成操作。

事實上,不管採用哪種探測方法,只要當雜湊表中空閒位置不多的時候,雜湊衝突的概率就會大大提高。為了盡可能保證雜湊表的操作效率,一般情況下,需要盡可能保證雜湊表中有一定比例的空閒槽位。

一般使用載入因子(load factor)來表示空位的多少。

載入因子是表示 hsah 表中元素的填滿的程度,若載入因子越大,則填滿的元素越多,這樣的好處是:空間利用率高了,但衝突的機會加大了。反之,載入因子越小,填滿的元素越少,好處是衝突的機會減小了,但空間浪費多了。

鍊錶法鍊錶法是一種更加常用的雜湊衝突解決辦法,相比開放定址法,它要簡單很多。如下**所示,在雜湊表中,每個位置對應一條鍊錶,所有雜湊值相同的元素都放到相同位置對應的鍊錶中。

鍊錶法【本文作者】

程式設計師小吳,乙個致力於用動畫去解釋資料結構的程式設計師。

什麼是雜湊表

1 基本原理 我們使用乙個下標範圍比較大的陣列來儲存元素。可以設計乙個函式 雜湊函式,也叫做雜湊函式 使得每個元素的關鍵字都與乙個函式值 即陣列下標 相對應,於是用這個陣列單元來儲存這個元素 也可以簡單的理解為,按照關鍵字為每乙個元素 分類 然後將這個元素儲存在相應 類 所對應的地方。但是,不能夠保...

什麼是雜湊表

為什麼要用雜湊表?陣列的特點是 定址容易,插入和刪除困難 鍊錶的特點是 定址困難,插入和刪除容易 那麼能不能綜合兩者的特性,做出一種定址容易,插入和刪除也容易的資料結構?答案是肯定的,這就是我們要了解的雜湊表,也叫雜湊表 什麼是雜湊表?雜湊表也叫hash表 是根據關鍵碼值而進行直接進行訪問的資料結構...

為什麼是雜湊表?!

為什麼是雜湊表?1 提出問題 這裡有乙個大的跨國公司,公司中的職員資訊全部儲存在資料庫中。對於其中的任何乙個職員來說,他們的唯一標識就是員工號,而這個公司的員工號是按照職員工作的地點以及部門及工作開始時間確定的,比如01 20 09 24 3,這乙個職工編號 純屬杜撰,但也有實際作用,因為在像群體查...