1. 程式人生 > 實用技巧 >資料結構38:完美雜湊函式

資料結構38:完美雜湊函式

目錄

一、完美雜湊函式

二、完美雜湊函式的更多用途

三、雜湊函式MD5/SHA

四、python的雜湊函式庫hashlib

五、完美雜湊函式用於資料一致性校驗


一、完美雜湊函式

給定一個數據項,如果一個雜湊函式能把每個資料項對映到不同的槽中,那麼這個雜湊函式就可以稱為“完美雜湊函式”。對於對丁的一組資料,總是能想辦法設計出完美的雜湊函式。

但是如果資料項經常性的變動,很難有一個系統性的方法來設計對應的完美雜湊函式。當然,衝突也不是致命性的錯誤,我們會有辦法處理的。

獲得完美雜湊函式的一種方法是擴大散列表的容量,大到所有可能出現的資料項都能夠佔據不同的槽,但這種方法對於可能資料項範圍過大的情況並不適用。

假如我們要儲存手機號(11位數字),完美雜湊函式得要求散列表具有百億個槽,這樣會浪費太多儲存空間。

退而求其次,好的雜湊函式需要具備特性:

  1. 衝突最少(近似完美)
  2. 計算難度低(額外開銷少)
  3. 充分分散資料項(節約空間)

二、完美雜湊函式的更多用途

除了用於在散列表中安排資料項的儲存位置,雜湊技術還用在資訊處理的很多領域。

由於完美雜湊函式能夠對任何不同的資料生成不同的雜湊值,如果把雜湊值當作資料的“指紋”或“摘要”,這種特性被廣泛的應用於資料的一致性校驗上。

由任意長度的資料生成長度固定的“指紋”,還要求具備唯一性,這在數學上是無法做到的,但是設計巧妙的“準完美”雜湊函式卻能在實用範圍內做到這一點。

作為一致性校驗的資料“指紋”函式需要具備如下特性:

  • 壓縮性:任意長度的資料,得到的“指紋”長度是固定的。
  • 易計算性:從原資料計算指紋很容易;從指紋計算原資料是不可能的。
  • 抗修改性:對原始資料的微小變動,都會引起指紋的大改變。
  • 抗衝突性:已知原資料和指紋,要找到相同指紋的資料(偽造)是非常困難的。

三、雜湊函式MD5/SHA

最著名的近似完美雜湊函式是MD5和SHA系列函式

MD5(Message Digest)將任何長度的資料變為固定長偉128位(16位元組)的摘要。(128位二進位制已經是一個極為巨大的數字空間,據說是地球沙粒的數量)。

SHA(Secure Hash Algorithm)是另一個雜湊函式,其中:

  • SHA-0/SHA-1輸出雜湊值160位(20位元組)

  • SHA-256/SHA-224分別輸出雜湊值256位、224位

  • SHA-512/SHA-384分別輸出雜湊值512位和384位

160位二進位制相當於10的48次方,地球上水分子數量數量估計是47次方

256位二進位制相當於10的77次方,已知宇宙的所有基本粒子大約72~87次方

雖然今年發現MD5/SHA-0/SHA-1三種雜湊函式,能夠以極特殊的情況來構造個別碰撞(雜湊衝突),但在使用中從未有實際的威脅。

四、python的雜湊函式庫hashlib

python自帶MD5/SHA系列的雜湊函式庫:hashlib,包括了md5/sha1/sha224/sha256/sha384/sha512等6種雜湊函式。

除了對單個字串進行雜湊計算之外,還可以用update方法對任意長的資料分部分來計算,這樣不過多大的資料都不會有記憶體不足的問題。

五、完美雜湊函式用於資料一致性校驗

資料檔案一致性判斷:為每個檔案計算其雜湊值,進對比其雜湊值即可得知是否檔案內容相同。

用於網路檔案下載完整性校驗;

用於檔案分享系統:網盤中相同的檔案,可以無需儲存多次。

加密形式儲存密碼

僅儲存密碼的雜湊值,使用者輸入密碼後,計算雜湊值並對比;

無需儲存密碼的明文即可判斷使用者是否輸入了正確的密碼。