雜湊演算法的應用

2022-03-03 21:07:58 字數 2420 閱讀 7989

不管是「雜湊」還是「雜湊」,這都是中文翻譯的差別,英文其實就是「hash」。

1.1 定義

將任意長度的二進位制值串對映成固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制值串就是雜湊值。

1.2 如何設計乙個優秀的雜湊演算法?

① 單向雜湊:

從雜湊值不能反向推導出雜湊值(所以雜湊演算法也叫單向雜湊演算法)。

② 篡改無效:

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

③ 雜湊衝突:

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

④ 執行效率:

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

7個常見應用:安全加密、唯一標識、資料校驗、雜湊函式、負載均衡、資料分片、分布式儲存。

2.1 安全加密

① 常用於加密的雜湊演算法:

② 對用於加密的雜湊演算法,有兩點格外重要,第一點是很難根據雜湊值反向推導出原始資料,第二點是雜湊衝突的概率要小。

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

2.2 唯一標識

通過雜湊演算法計算出資料的唯一標識,從而用於高效檢索資料。

2.3 資料校驗

利用雜湊演算法對輸入資料敏感的特點,可以對資料取雜湊值,從而高效校驗資料是否被篡改過。

2.4 雜湊函式

雜湊函式中用到的雜湊演算法更加關注雜湊後的值能不能平均分布,以及雜湊函式的執行快慢。

2.4 負載均衡

2.4.1 需求

如何實現乙個會話粘滯(session sticky)的負載均衡演算法?也就是說,在一次會話中的所有請求都路由到同乙個伺服器上。

2.4.2 解決方案

通過雜湊演算法對客戶端ip或會話id計算雜湊值,將取得的雜湊值與伺服器列表的大小進行取模運算,最終得到的值就是應該被路由到的伺服器編號。這樣,就可以把同乙個ip過來的請求都路由到同乙個後端伺服器上。

2.5 資料分片

2.5.2 如何快速判斷是否存在相簿中?

① 需求描述

假設現在我們的相簿中有1億張,如何快速判斷是否在相簿中?基本方式是給每個去唯一表示(或者資訊摘要),然後構建雜湊表。

② 問題分析

很顯然,在單台機器上構建雜湊表示行不通的,因為單台機器的記憶體有限,而1億張構建雜湊表遠遠超過了單台機器的記憶體上限。

② 解決方案

準備n臺機器,讓每台機器只維護一部分對應的雜湊表。我們每次從相簿中讀取乙個,計算唯一標識,然後與機器個數n求餘取模,得到的值就對應要分配的機器編號,然後將這個的唯一表示和路徑發往對應的機器構建雜湊表。

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

如何估算給1億張構建雜湊表大約需要多少臺機器?

雜湊表中每個資料單元包含兩個資訊,雜湊值和檔案的路徑。假設我們通過 md5 來計算雜湊值,那長度就是 128 位元,也就是 16 位元組。檔案路徑長度的上限是 256 位元組,我們可以假設平均長度是 128 位元組。如果我們用煉表法來解決衝突,那還需要儲存指標,指標只占用 8 位元組。所以,雜湊表中每個資料單元就占用 152 位元組(這裡只是估算,並不準確)。

假設一台機器的記憶體大小為 2gb,雜湊表的裝載因子為 0.75,那一台機器可以給大約 1000 萬(2gb*0.75/152)張構建雜湊表。所以,如果要對 1 億張構建索引,需要大約十幾台機器。在工程中,這種估算還是很重要的,能讓我們事先對需要投入的資源、資金有個大概的了解,能更好地評估解決方案的可行性。

實際上,針對這種海量資料的處理問題,我們都可以採用多機分布式處理。借助這種分片的思路,可以突破單機記憶體、cpu 等資源的限制。

2.6 分布式儲存

2.6.1 什麼是分布式儲存?

分布式儲存就是將資料儲存在多台機器上並提供高效的讀取、寫入支援。那如何決定將哪個資料放到哪個機器上呢?可以利用資料分片的思想,即通過雜湊演算法對資料取雜湊值,然後對機器個數取模,這個最終值就是應該儲存的快取機器編號。

2.6.2 遇到的問題是什麼?

如果資料持續增多,原來的機器數量已經不能滿足需求,就需要增加機器,這時就麻煩了,因為所有的資料都需要重新雜湊值進行再次分配。這就相當於,快取中的資料一下子都失效了,所有的資料請求都會穿透快取,直接去請求資料庫。這樣就可能發生雪崩效應,壓垮資料庫。

2.6.3 解決方案是什麼?

① 這時,需要一種方法,使得新加入乙個機器後,並不需要做大量的資料搬移。那就是在分布式系統中應用非常廣泛的一致性雜湊演算法。

② 一致性雜湊演算法的基本思想是什麼呢?為了說清楚這個問題,我們假設有k個機器,資料的雜湊值範圍是[0-max],我們將整個範圍劃分成m個小區間(m遠大於k),每個機器複雜m/k個小區間。當有新機器加入的時候,我們就將某幾個小區間的資料,從原來的機器中搬移到新的機器中。這樣,既不用全部重新雜湊、搬移資料,也保持了各個機器上資料量的均衡。

雜湊演算法的應用

將任意長度的二進位制值串對映成固定長度的二進位制值串,這個對映規則就是雜湊演算法。通過原始資料對映之後得到的二進位制值串就是雜湊值。乙個優秀的雜湊演算法需滿足以下幾點 從雜湊值不能反向推導出原始資料 所以雜湊演算法也叫單向雜湊演算法 對輸入資料非常敏感,即使原始資料只修改了乙個bit,最後得到的雜湊...

雜湊演算法的應用

我們前面幾節講到 雜湊表 雜湊函式 這裡又講到 雜湊演算法 你是不是有點一頭霧水?實際上,不管是 雜湊 還是 雜湊 這都是中文翻譯的差別,英文其實就是 hash 所以,我們常聽到有人把 雜湊表 叫作 雜湊表 hash 表 把 雜湊演算法 叫作 hash 演算法 或者 雜湊演算法 那到底什麼是雜湊演算...

雜湊演算法的理解和應用

我們下面引用一段文本來解釋什麼是雜湊演算法 雜湊是一種加密演算法 雜湊函式 hash function 也稱為雜湊函式或雜湊函式。雜湊函式是乙個公開函式,可以將任意長度的訊息m對映成為乙個長度較短且長度固定的值h m 稱h m 為雜湊值 雜湊值 hash value 雜湊值或者訊息摘要 messag...