資料結構 雜湊演算法

2021-09-29 14:50:40 字數 2941 閱讀 6010

最近開始學習王爭老師的《資料結構與演算法之美》,通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。

雜湊演算法的定義是將任意長度的二進位制值串對映為固定長度的二進位制值串。這個對映規則就是雜湊演算法。通過原始資料對映後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法應滿足幾點要求:

1.從雜湊值不能反向推導出原始資料(因此雜湊演算法也叫單向雜湊演算法)。

2.對輸入資料非常敏感,哪怕原始資料只修改了乙個bit,最後得到的雜湊值也大不相同。

3.雜湊衝突的概率要很小,對於不同的原始資料,雜湊值相同的概率非常小。

4.雜湊演算法的執行效率要盡量高效,針對較長的文字,也能快速計算出雜湊值。

舉個例子,

md5(「今天我來講雜湊演算法」) = bb4767201ad42c74e650c1b6c03d78fa

md5(「jiajia」) = cd611a31ea969b908932d44d126d195b

可以看出,無論雜湊的文字有多長,多短,通過md5雜湊之後,得到的雜湊值長度是相同的,而且得到的雜湊值看起來像是一堆隨機數,毫無規律,也很難根據雜湊值反推回對應的文字。

雜湊演算法的應用非常非常多,作者選了最常見的7個,分別是安全加密、唯一標識、資料校驗、雜湊函式、負載均衡、資料分片和分布式儲存。

應用一:安全加密

最常用於加密的雜湊演算法是md5(md5訊息摘要演算法)和sha(安全雜湊演算法)。除此之外,還有其他加密演算法,比如des(資料加密演算法)、aes(高階加密演算法)。

對於加密的雜湊演算法,有兩點格外重要。第一點是很難根據雜湊值反向推導出原始資料,第二點是雜湊衝突的概率要很小。第一點容易理解,為了防止原始資料洩露。第二點需要對為什麼雜湊演算法無法做到零衝突進行解釋一下:雜湊演算法產生的雜湊值的長度是固定且有限的。以md5為例,雜湊值是固定的128位二進位制串,能表示的資料是有限的,最多表示2128個資料,而我們要雜湊的資料是無窮的。如果對2128+1個資料求雜湊值,就必然存在雜湊值相同的情況。一般情況下,雜湊值越長的雜湊演算法,雜湊衝突的概率越低。

沒有絕對安全的加密。越複雜、越難破解的加密演算法,需要的計算時間也越長。在實際開發過程中,也需權衡破解難度和計算時間,來決定究竟使用哪種加密演算法。

應用二:唯一標識

以為例,如果要在相簿中搜尋一張圖是否存在,不能單純地用的元資訊來比對。比較笨的辦法就是拿要查詢的的二進位製碼串與相簿中所有的二進位製碼串一一比對,但這種比對非常耗時。我們可以給每乙個取乙個唯一標識,或者說資訊摘要。比如,我們可以從的二進位製碼串開頭取100個位元組,從中間取100個位元組,從最後再取100個位元組。然後將這300個位元組放在一起,通過雜湊演算法(如md5),得到乙個雜湊字串,用它作為的唯一標識,這樣可以減少很多任務作量。

應用三:資料校驗

應用四:雜湊函式

雜湊函式也是雜湊演算法的一種應用。雜湊函式是設計乙個雜湊表的關鍵,直接決定了雜湊衝突的概率和雜湊表的效能。但相比於雜湊表其他應用,雜湊函式對於雜湊演算法衝突的要求要低很多。即使出現了個別雜湊衝突,只要不是過於嚴重,都可以通過開放定址法或鍊錶法。

雜湊函式對於能否反向解密並不關心。它更關注雜湊後的值能否平均分布。此外,雜湊函式執行的快慢,也會影響雜湊表的效能。故雜湊函式用的雜湊演算法一般都比較簡單,比較追求效率。

應用五:負載均衡

如何實現乙個會話沾滯的負載均衡演算法?也就是說,我們需要在同乙個客戶端上,在一次會話中所有請求都路由到同乙個伺服器上。

最直接的方法就是維護一張對映關係表,內容是客戶端ip位址或會話id與伺服器編號的對映關係。客戶端發出的每次請求,都要先在對映表中查詢應該路由到伺服器的編號,然後再請求編號對應的伺服器,但有幾個弊端:

1、如果客戶端很多,對映表可能會很大,比較浪費記憶體空間。

2、客戶端下線,上線,伺服器擴容、縮容都會導致對映失效,這樣維護對映表的成本就會很大。

但是如果借助雜湊演算法,對客戶端ip位址或會話id計算雜湊值,將取得的雜湊值與伺服器列表的大小進行取模運算,最終得到的值就應該被路由到伺服器編號。

應用六:資料分片

雜湊演算法可以用於資料的分片,舉兩個例子:

2、如何快速判斷是否在相簿中?

同樣對資料進行分片,採用多機處理。每次從相簿中讀取乙個,計算唯一標識,然後與機器個數n求餘取模,得到的值就對應要分配的機器編號,然後將這個的唯一標識和路徑發往對應的機器構建雜湊表。

當判斷乙個是否在相簿中時,同樣通過雜湊演算法,計算這個的唯一標識,然後與機器個數n求餘取模。假設得到的值是k,那就去編號k的機器構建的雜湊表中查詢。

估算一下,1億個構建雜湊表大約需要多少臺機器?假設採用md5來計算雜湊值,那長度為128位元,也就是16位元組。檔案路徑長度上限是256位元組,我們假設平均長度是128位元組。如果用鍊錶法解決衝突,還需要儲存指標,指標只占用8個位元組。假設一台機器的記憶體大小為2gb,雜湊表裝載因子為0.75,故大約1000萬(2gb

∗0.75

/152

2gb*0.75/152

2gb∗0.

75/1

52)張構建雜湊表。

針對這種海量資料的處理問題,都可以採用多機分布式處理。

應用七:分布式儲存

為了提高資料的讀取、寫入能力,一般都採用分布式的方式來儲存資料,比如分布式快取。如果有大量資料需要快取,需要將資料分布在多台機器上。借用資料分片的思想,即通過雜湊演算法對資料取雜湊值,然後對機器個數取模,這個最終值就是應儲存的快取機器編號。

但如果資料增多,原來的10個機器已經無法承受,就需要擴容了。比如擴容到11個機器,這時候麻煩就來了。所有的資料都需要重新計算雜湊值。然後重新搬移到正確的機器上,這就相當於快取中的資料一下子就都失效了。所有的資料請求都會穿透快取,直接去請求資料庫,這樣就可能壓垮資料庫。

因此,需要一種方法,使得在新加入乙個機器後,並不需要做大量的資料搬移——一致性雜湊演算法。

假設有k個機器,資料的雜湊值的範圍是[0,max]。我們將整個範圍劃分成m個小區間(m遠大於k),每個機器負責m/k個小區間。當有新機器加入的時候,就將某幾個小區間資料從原來的機器中搬移到新的機器中,這樣,既不用全部重新雜湊,搬移資料,也保持了各機器上資料數量均衡。

資料結構 開雜湊雜湊演算法

雜湊表在插入和查詢擁有好高的效率,當資料足夠的多時,相比於平衡樹,效率幾乎是平衡樹的兩倍。開雜湊雜湊具有的優勢就是,雜湊表中存放著鍊錶的位址,每個進來的資料通過雜湊函式求得位置,存放在相應位置的鍊錶中。查詢資料時,只需要查詢該資料通過雜湊函式求得的位置下的鍊錶中是否存在,就能高效的完成查詢 插入時,...

資料結構和演算法 雜湊演算法

前面我們學習了雜湊表,雜湊函式,和雜湊演算法啥關係?其實不管雜湊還是雜湊,都是翻譯的差別,對於英文都是hash,所以雜湊 雜湊 hash 雜湊演算法的定義 將任意長度的二進位制串對映為固定長度的二進位制串,這種對映規則就是雜湊演算法。通過原始資料對映成的規定固定長度的二級制串就是雜湊值乙個優秀的雜湊...

資料結構和演算法 雜湊演算法

一 定義 1 將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。通過原始資料對映之後得到的二進位制值串就是雜湊值。二 hash演算法編寫要求 從雜湊值不能反向推導出原始資料 對輸入資料非常敏感,哪怕原始資料只修改了乙個bit,最後得到的hash值也會變化 雜湊衝突的...