1. 程式人生 > >十一、雜湊演算法

十一、雜湊演算法

業界著名的雜湊演算法也有很多,比如 MD5、SHA 等。
側重點:在實際應用中,如何用雜湊演算法解決問題?

一、概述

雜湊演算法:將任意長度的二進位制值串對映為固定長度的二進位制值串的對映規則

雜湊值:通過原始資料對映之後得到的二進位制值串

二、雜湊演算法的設計要求

  • (1)從雜湊值不能反向推導出原始資料(所以雜湊演算法也叫單向雜湊演算法);
  • (2)對輸入資料非常敏感,哪怕原始資料只修改了一個 Bit,最後得到的雜湊值也大不相同;
  • (3)雜湊衝突的概率要很小,對於不同的原始資料,雜湊值相同的概率非常小;
  • (4)雜湊演算法的執行效率要儘量高效
    ,針對較長的文字,也能快速地計算出雜湊值。

示例 ==》MD5雜湊演算法
注:MD5 的雜湊值是 128 位的 Bit 長度,為了方便表示,我把它們轉化成了 16 進位制編碼

MD5("jiajia") = cd611a31ea969b908932d44d126d195b
MD5(" 我今天講雜湊演算法!") = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5(" 我今天講雜湊演算法 ") = a1fb91ac128e6aa37fe42c663971ac3d

==》無論雜湊文字長度,都可得到長度相同的雜湊值;
==》兩個相似的文字,得到的雜湊值完全不同。

三、應用

最常見的幾種應用:安全加密、唯一標識、資料校驗、雜湊函式、負載均衡、資料分片、分散式儲存。

1、安全加密

終極目標:一種快速並且很難被破解的雜湊演算法

(1)安全加密的雜湊演算法

最常用:MD5(MD5 Message-Digest Algorithm,MD5 訊息摘要演算法)和SHA(Secure Hash Algorithm,安全雜湊演算法)。
其他:DES(Data Encryption Standard,資料加密標準)、AES(Advanced Encryption Standard,高階加密標準)。

(2)安全加密雜湊演算法的要求

對用於加密的雜湊演算法來說,有兩點格外重要:

  • 很難根據雜湊值反向推匯出原始資料==》防止原始資料洩露
  • 雜湊衝突的概率要很小

==》MD5中雜湊值是固定的 128 位二進位制串,能表示的資料是有限的,最多能表示 2^128 個數據,而非無限的資料。
==》即便雜湊演算法存在衝突,但是在有限的時間和資源下,雜湊演算法還是很難破解的。
==》沒有絕對安全的加密

在實際的開發過程中,也需要權衡破解難度和計算時間,來決定究竟使用哪種加密演算法。

2、唯一標識(資訊摘要)

目標:在海量相簿中,搜尋一張圖是否存在。

思路一:每個影象取一個唯一標識(資訊摘要),eg:圖片的二進位制碼串頭取100個位元組,中間取100個位元組,從最後取100個位元組。將這300個位元組串聯並通過雜湊演算法,得到一個雜湊字串,作為圖片的唯一標識。

思路二:提升效率。把每個圖片的唯一標識和相應的圖片檔案在相簿中的路徑資訊,都儲存在散列表中。當要檢視某個圖片是否在相簿時,先通過雜湊演算法對圖片取唯一標識,然後再散列表中查詢是否存在該唯一標識。若不存在,則說明不在相簿中;若存在,可通過散列表中儲存的檔案路徑獲取圖片,跟現在要插入的圖片進行全量的比對,看是否完全一樣。若一樣,則說明已存在;若不同,則說明兩張圖片雖唯一標識相同,但不是相同的圖片。

3、資料校驗

目標:如何檢驗檔案塊的安全、正確、完整?

思路
通過雜湊演算法,對 100 個檔案塊分別取雜湊值,並且儲存在種子檔案中。
==》雜湊函式對資料敏感
==》當檔案塊下載完成之後,通過相同的雜湊演算法,對下載好的檔案塊逐一求雜湊值,然後跟種子檔案中儲存的雜湊值比對。如果不同,說明這個檔案塊不完整或者被篡改了,需要再重新從其他宿主機器上下載這個檔案塊。

4、雜湊函式

雜湊函式它對雜湊演算法的要求非常特別,更加看重的是雜湊的平均性和雜湊演算法的執行效率。

5、負載均衡

會話粘滯(session sticky)的負載均衡:在同一個客戶端上,在一次會話中的所有請求都路由到同一個伺服器上。

方法:通過雜湊演算法,對客戶端IP地址或者會話ID計算雜湊值,將取得的雜湊值與伺服器列表的大小進行取模運算,最終得到的值就是應該被路由到的伺服器編號。

6、資料分片

(1)統計“搜尋關鍵詞”出現的次數

目標:1T的日誌檔案,記錄使用者的搜尋關鍵詞,要統計每個關鍵詞被搜尋的次數。

分析:(1) 日誌很大,不能放入一臺機器中;(2)一臺機器處理1T資料,耗時長。

方法概述:先對資料分片,然後採取多臺機器處理的方法,來提高處理速度。==》MapReduce 的基本思想

具體方法:用 n 臺機器並行處理。首先從搜尋記錄的日誌檔案中,依次讀取每個搜尋的關鍵詞,並通過雜湊函式計算雜湊值,然後跟n取模,最終得到的值,就是應該被分配到的機器編號。
==》雜湊值相同的搜尋關鍵詞(也就是說,同一個搜尋關鍵詞)被分配到同一個機器上。每個機器分別計算關鍵詞出現的次數,其和就是最終的結果。

(2)快速判斷圖片是否在相簿中?

目標:1億張圖片,快速判斷圖片是否在相簿中。

方法概述:同樣進行資料分片==》利用多機處理(n臺機器,每臺機器只維護一部分圖片對應的散列表)。

具體方法:每次從相簿中讀取一個圖片,計算唯一標識,然後與機器個數n求餘取模,得到的值就對應要分配的機器編號,然後將該圖片的唯一標識與路徑發到對應的機器構建散列表。

判斷方法:通過同樣的雜湊演算法,計算該輸入圖片的唯一標識,然後與機器個數n求餘取模。假設得到的值為k,就去編號為k的機器構建的散列表中查詢。

裝置估算:散列表中每個資料單元包含兩個資訊:雜湊值和圖片檔案路徑。其中,通過MD5計算雜湊值(長度為128bit,即16位元組);路徑長度上限為256位元組,不妨假設其平均長度為128位元組。若採用連結串列法來解決衝突,則還需儲存指標,指標佔用8位元組。
==》估算:散列表中每個資料單元佔用152位元組
==》裝置假設:記憶體為2G,散列表裝載因子為0.75,則一臺機器可以大約給1000萬(2G*0.75/152)張圖片構建散列表
==》對於1億張圖片來說,大約需要十幾臺機器。

實際:針對這種海量資料的處理問題,採取多機分散式處理==》突破單機記憶體、CPU等資源限制。

7、分散式儲存——一致性雜湊演算法

情況:海量資料快取,利用前面資料分析的思想,即通過雜湊演算法對資料取雜湊值,然後對機器個數取模,得到的值就是應該儲存的快取機器編號。但是,在機器擴容時,所有的資料都要重新計算雜湊值,然後重新搬移到正確的機器上。快取中資料一下子都失效了,所有的資料請求都會穿透快取,直接去請求資料庫,很可能會發生 雪崩效應,壓垮資料庫

目標:新加入一臺機器後,並不需要做大量的資料搬移。==》一致性雜湊演算法

方法:假設有 k 個機器,資料的雜湊值範圍為[0, MAX]。將整個範圍劃分為m個小區間(m遠小於k),每個機器負責 m/k 個小區間。當有新機器加入時,將某幾個小區間的資料,從原來的機器中搬移到新的機器中
==》既不用全部計算雜湊、搬移資料,也保持各個機器上資料數量的均衡。