雜湊是一種使用頻率很高的資料結構,通常來說,雜湊是一個定義域到值域的函式,對於任意輸入的定義域內的某個值,返回一個值域內的值。因為它是一個函式,所以具備數學中函式定義賦予的性質。簡單來說,一個定義域內的值只能對應到一個值域上的值,但是一個值域上的值可能有多個定義域的值。
作為資料結構的雜湊,需要儘可能的把定義域內相鄰的輸入給分散到值域空間裡面去,越散越好。學過計算機的都知道,雜湊提供了近似演算法為O(1)複雜度的訪問。常見的基於雜湊的資料結構主要是雜湊集合和雜湊字典。
任何雜湊都存在著碰撞的問題。所謂的碰撞是指不同定義域內的值,對映到同一個值域的值上。所以我們常用的資料結構都有解決雜湊碰撞的辦法。因為篇幅有限,這裡我們就不展開討論了。
雜湊在資料庫內和分散式系統內也廣泛使用,不但用在分散式系統的資料分割槽上,也用在資料庫系統內的"join"的實現上。事實上排序和雜湊這兩種演算法構成了絕大多數分散式資料處理系統演算法的基礎。
密碼學上的雜湊和普通的雜湊比起來,主要是強度上的不同,它有以下幾個特性:
1、給定定義域的輸入,很容易算出值域的輸出來。但是給定值域的輸出要找到定義域對應的輸入則是一件幾乎不可能的事情。我們定義幾乎不可能的事情可以理解為一個人幾輩子的時間都無法破解
2、對定義域的輸入做微小的變動,都會導致值域的輸出有巨大的變動。這也是普通雜湊需要具備的性質。只是密碼學上的雜湊對此強調的更多
3、密碼學上的雜湊還要有抗碰撞性。簡單來說,如果對於定義域內給定的兩個不同的輸入,它們對應的輸出也不同,那麼雜湊函式具有強碰撞性。
如果給定一個輸入,在合理的時間內,無法找到另外一個輸入產生同樣的輸出,那麼這個雜湊函式就具備了密碼學上的抗碰撞性。前者是絕對不存在,後者是無法輕易計算出來
4、密碼學上雜湊函式還應該具備所謂的難題友好性特點。具體來說,給定值域的值去尋找特定的輸入,沒有什麼辦法比暴力窮舉更有效的雜湊演算法成為具備難題友好性。這個特性對比特幣很重要
密碼學上的雜湊最為重要的特點是對一段位元流生成摘要。簡單來說如果我們把位元流作為輸入,把雜湊的結果作為輸出的話,那麼輸出就是一個合法的摘要。如果我們把位元流和摘要同時釋出出去。假定雜湊無法更改的前提下,我們可以驗證位元流是否被篡改。為什麼可以這樣做呢?
給定不同的輸入,雜湊函式會產生不同的結果。密碼學的雜湊不可能在合理的時間內從輸出反推出輸入,也不可能找到另外一個輸入可以產生相同的輸出。所以只要我們有辦法保證摘要無法被篡改,我們就可以使用下面的步驟來判斷位元流是否被篡改:
1、用雜湊演算法對給定的位元流算雜湊
2、比較算出來的雜湊和拿到的雜湊是否一致,一致表示沒有篡改,否則有篡改
密碼學的雜湊這個特性被廣泛用來校驗接收到的東西是否在傳輸途中被篡改。這也是比特幣賬本保證記錄被篡改以後可以立刻檢測到的基礎。