1. 程式人生 > >什麼是雜湊Hash演算法

什麼是雜湊Hash演算法

計算機領域內的大多數查詢演算法都與儲存資料的規模呈正相關,用於衡量查詢演算法效率的量我們稱為平均查詢長度,一般情況下,比較優秀的查詢演算法的平均查詢長度也不會短於資料規模以2為底的對數(log_{2} n)。

雜湊演算法中,我們把資料項中的關鍵字用一種特定的對應關係和儲存資料項的地址或地址偏移量對應起來。注意:這種對應一般不是一一對應,因為不可能有足夠多的地址對應近乎無窮多的關鍵字。
這樣一來,當我們知道資料關鍵字的時候,在大多數情況下可以在常數時間(與資料規模無關的常數)記憶體取這個關鍵字。其他的時候,有可能發生多個關鍵字佔據同一地址的現象,我們稱之為碰撞。這種情況下需要對關鍵字進行二次或更多次的處理(如果發生多次碰撞),所費時間在最差情況下也只與規模成正比。
只要這種函式的對應關係取得足夠好,碰撞就會較少的發生,從而使平均查詢長度在資料規模可控的情況下大幅度縮短,從而提高查詢效率。

雜湊函式除此以外,也可以用來對廣義上的字串(例如文字、視訊、圖片、程式等等等等)進行特徵驗證。常見的有CRC32(32位迴圈冗餘校驗),從MD2、MD3、MD4發展而來的MD5(訊息摘要演算法第五版),SHA1(安全雜湊演算法)等等。

這類雜湊演算法的最初用途僅僅是對這些廣義字串進行完整性校驗,因為在傳輸中損壞的位元位往往僅僅是極少數,這些少數的錯誤用上述提到的演算法可以得出和原本正確檔案截然不同的值,這也就使得檔案完整性校驗的開銷得以縮小。

問題中描述的用途其實並不完全適當,但是在一定程度內可行。

因為訪問的網路地址有無窮多個,但是所有的雜湊演算法生成的特徵值都有限,在極端情況下,很有可能會出現兩個不同的網路地址具有相同特徵值的情況。
這不僅使得在得知特徵值時,反向推測網路地址具有了可行性(雖然開銷可能極大,需要大量時間窮舉),而且在網路地址增長速度極快的今天,安全地址可能和危險地址發生碰撞導致誤殺或者錯誤放行的情況(現在雖然可能還沒出現過,但不能排除這種可能性)。

這種雜湊演算法本身雖然在理論上是不可逆的,但是它的思想保證了它也不是絕對可靠的。