1. 程式人生 > >演算法筆記-雜湊演算法1

演算法筆記-雜湊演算法1

什麼是雜湊演算法

將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映規則就是雜湊演算法,對映得到的值就叫雜湊值。

設計一個優秀的雜湊演算法,需要注意以下幾點:

1:從雜湊值不能反向推匯出原始資料,所以雜湊演算法也叫單項雜湊演算法。
2:對輸入資料非常敏感,哪怕原始資料修改了 1 個 Bit,最後得到得雜湊值也不一樣。
3:雜湊衝突的概率要小,對於不同的原始資料,得到的雜湊值相同的概率要小。
4:雜湊演算法的執行效率要高,即便是原始資料很長,也能高效的計算出雜湊值。

雜湊演算法應用之安全加密

雜湊演算法常見的應用就是加密,比如說:MD5 也叫資訊摘要演算法;SHA 也叫安全雜湊演算法。

對於加密的雜湊演算法來說,有兩點至關重要:很難通過雜湊值反向推出原始資料,雜湊衝突的概率要很小。

為什麼雜湊衝突無法避免?組合數學中有一個鴿巢原理,也叫抽屜原理。也就是說,是一個鴿子放進是個抽屜裡面,必然會有兩隻鴿子待在一個抽屜裡面,這是不可避免的結果。對於 MD5 加密演算法來說,得到的雜湊值是固定的 128 位二進位制串,也就是說最多能標識 2^128 個數據。如果現在有 2^128 + 1 個數據,那麼最終得到的雜湊值至少會有一個重複。

越是複雜的雜湊加密演算法,最終得到結果越是難以被破解,但是計算雜湊值的複雜度也就相應的提高了。所以,雜湊函式的設計,要綜合考慮破解難易程度和演算法執行效率的平衡點。

雜湊演算法應用之唯一標識

如果要在海量相簿中判斷一張圖片是否存在,僅僅根據圖片名字判斷是不合理的,重名圖片一定很多。

在計算機中,任何檔案都可以轉化為二進位制碼串,所以可以拿圖片的碼串進行對比。但是,檔案大小不一,過大的檔案,二進位制碼串必定很長,對比起來肯定耗時費力。

我們可以利用雜湊演算法為圖片生成一個資訊摘要作為圖片的唯一標示,查詢圖片的時候可以用資訊摘要做對比。資訊摘要的生成,可以在圖片的前中後三部分分別取出 100 個位元組,生成最終的唯一標示。

在上述基礎上,我們可以把圖片的資訊摘要當做 key 值,圖片的其他資訊作為 value 值,將其儲存在散列表中,這就進一步提高了圖片查詢的效率。

雜湊演算法應用之資料校驗

當我們通過種子檔案從網際網路上下載視訊檔案的時候,原始檔案(假如說大小為 1G)會被分割成多個檔案快(假設分割成 10 塊,每塊大小約 100M)。當我們將 10 塊檔案下載到本地的時候,再拼接成一個完整的檔案,就可以觀看視訊了。

如果在下載過程中,檔案被攔截篡改,那下載到本地拼接後就不能觀看,所以需要我們對資料進行校驗。

首先,我們可以對分割的 10 塊檔案分別雜湊取值,然後將雜湊值儲存在種子檔案中。當用戶下載完成檔案後,雜湊取值,再和種子檔案中的雜湊值做對比,就可以校驗出下載的檔案是否經過篡改。

雜湊演算法應用之雜湊函式

雜湊函式主要應用在散列表中,它直接決定了雜湊衝突的概率和散列表的效能。相對於其他雜湊演算法的應用,雜湊函式對雜湊衝突的容忍性就高的多了。即便出現了雜湊衝突,可以通過開放定址法以及連結串列法解決雜湊衝突。

雜湊函式同樣也不關心是否可以通過雜湊值反向推出原始資料。在散列表中,更關心雜湊函式得到的雜湊值是否隨機均勻分佈。當然,雜湊函式執行的效率也關係著散列表的效能。

補充

在開發過程中,我們會把使用者的明文密碼雜湊求值後儲存起來,保障使用者的隱私。但是即便如初,一旦資料庫資料洩露,密碼一樣不夠安全。

字典攻擊:黑客將常用的密碼雜湊求值後儲存在字典資料庫中,當黑客得到得到使用者資訊,即便是加密過的密碼,用字典庫中的雜湊值做對比,從而匹配到使用者的密碼。

針對字典攻擊,我們可以採用加鹽(salt)的方式進行加密。在給使用者的密碼加密的時候,額外對密碼追加一個字串,然後在進行雜湊求值,追加的字串就是鹽 (salt)。該鹽可以放在密碼的首中尾任意位置。

王爭老師總結了一句很經典的話:安全和攻擊是一種博弈關係,沒有絕對的安全。所有的安全措施,只不過是增加了攻擊的成本而已。

總結

本文創作靈感來源於 極客時間 王爭老師的《資料結構與演算法之美》課程,通過課後反思以及借鑑各位學友的發言總結,現整理出自己的知識架構,以便日後溫故知新,查漏補缺。

初入演算法學習,必是步履蹣跚,一路磕磕絆絆跌跌撞撞。看不懂別慌,也別忙著總結,先讀五遍文章先,無他,唯手熟爾~
與諸君共勉

關注本人公眾號,第一時間獲取最新文章釋出,每日更新一篇技術文章。

在這裡插入圖片描述