常見的雜湊生成演算法
平方取中法
進製轉換法
取模法偽隨機數法
雜湊演算法的特點
雜湊演算法的應用
雜湊(hash)也被稱之為雜湊,是指將任意長度的輸入的資料按照某種規則(雜湊演算法)來變為定長的輸出的方式。這個輸出也被稱之為雜湊(雜湊)值。
雜湊表(雜湊表)是一種根據關鍵碼值key來獲取資料的資料結構。在雜湊表中,在雜湊表中,每乙個位置都與這個key值一一對映。所以該資料結構查詢速度很快。
key值可以使任意一種資料型別,包括但不限於int、double、char、string…而在雜湊表中,資料一般是以陣列的形式儲存。也就是說,雜湊表中資料的位置可以表示為陣列的下標。所以,一般我們通過使用雜湊演算法將key值轉化為乙個規定範圍內的正整數x。然後將這個key值所表示的資料存放在下標為x的位置上。
首先,雜湊生成演算法一般都是對數值進行運算,所以,如果是其他型別的資料,一般將其轉化為數字再進行運算。例如:字元/字串型別的資料一般根據其ascii碼值轉換為數字等。當資料量較大時,也會選擇性的擷取其的一部分。
將key值分割為長度相同的幾部分,然後求這幾部分的疊加和(捨去最高位的進製)。這種方法被稱之為摺疊法。
摺疊法被分為移位疊加和邊界疊加兩種方法。
移位疊加
將分割好的幾部分最高位對齊,然後進行累加運算。這種方法被稱為移位疊加法。例如:使用移位疊加法,將資料4568123547801257轉化為不超過10000的十進位制資料。
4568
1235
4780
+ 1257
= 1840
邊界疊加
將分割好的幾部分進行摺疊對齊。即每部分的最低位與最高位對齊,若第一部分定為編號1,編號為偶數的部分逆序排列。例如:使用比邊界疊加法,將資料4568123547801257轉化為不超過10000的十進位制資料。
4568
5321
4780
+ 7521
= 2190
將key值進行平方運算,然後根據需求取其平方值中間的若干位作為雜湊值。例如:利用平方取中法,獲取75843的雜湊值,雜湊值不超過10000。首先758432 = 5,752,160,649。取其中間的4位,為2160。即75843的雜湊值為2160。
將十進位制的key看做為乙個x進製的資料(x一般取質數)然後將其轉換為十進位制數的方法被稱為進製轉換法。例如:使用進製轉換法,生成1569的雜湊值。我們取x為13,則:9 * 13 0 + 6 * 13 1 + 5 * 13 2 + 1 * 133 = 3129。即1569的雜湊值為3129。
將key值對乙個特定值x進行取模運算。x一般取質數。例如14656231的雜湊值為:14656231 mod 103 = 52。14656231的雜湊值即為52。
偽隨機數法是將key值經過隨機演算法運算後生成的結果模上陣列長度作為雜湊值。公式:hash(key)=(akey+c)%length。其中:a,c為質數,length為陣列長度。例如:key值為489415,偽隨機數法操作如下:
hash(489415)=(6691489415+929)%200=94。即489415的雜湊值為94。
在一般情況下,計算乙個資料的雜湊值會將以上方法選取幾種組合使用,以保證獲得的雜湊值足夠隨機。
雜湊演算法具有以下的特點:
輸入敏感:哪怕只是改動一位數字,最後獲得的雜湊值都會有很大的不同。
不可逆:在有限的時間內,很難通過雜湊值推導出原本的key值。
一致性:相等的key值一定能獲取到相同的雜湊值。
均勻性:均勻的雜湊key值。
雜湊演算法可以用來校驗資料/檔案是否相同。對於較大的檔案或資料,可以擷取其一部分,然後通過雜湊演算法計算雜湊值。當這兩個(或多個)檔案的雜湊值計算出來後,通過比對雜湊值是否相等來判斷這兩個(或多個)檔案是否一致。這樣操作極大地減少了資源的使用和時間。
雜湊表負載均衡:比如說,現在有多個伺服器。當乙個請求過來時,如何分配伺服器來響應這個請求?我們可以對通過這個請求的唯一識別符號(如ip位址)進行操作,獲取規定範圍的雜湊值(一般將伺服器按照從0到n編號。計算雜湊值的最後一步模上n+1則一定會獲得伺服器編號範圍內的雜湊值)。根據這個雜湊值選取響應的伺服器。
分布式儲存:與負載均衡相似,當時當儲存資料的伺服器增加時,就必須重新設計雜湊演算法。類似這樣的問題可以通過一致性雜湊演算法解決。
資料加密:因為雜湊演算法具有不可逆性,所以可以用來對特殊的資料進行加密。例如密碼,在使用者註冊的時候將密碼的雜湊值儲存在資料庫內,在使用者登入時可以通過比對輸入的密碼的雜湊值與資料庫中的雜湊值是否相等來判斷輸入的密碼是否相等。(但是不常用,因為雜湊演算法無法避免的會產生雜湊碰撞問題,會降低安全性。並且有更安全、更優秀的加密演算法)
GeHashCode與雜湊演算法
gehashcode三原則 1.如果兩個物件相等 由operator 定義 它們必須產生相同的雜湊碼。否則,這樣的雜湊碼不能用來查詢容器中的物件。2.對於任何乙個物件a,a.gethashcode 必須是乙個例項不變式 invariant 即不管在a上呼叫什麼方法,a.gethashcode 都必須...
雜湊表與雜湊演算法學習筆記
雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...
雜湊的定義與整數雜湊
一般來說,雜湊可以濃縮成一句話 將元素通過乙個函式轉化為整數,使得該整數可以盡量唯一地代表這個元素。其中,把這個轉換函式稱為雜湊函式h,也就是說,如果該元素在轉換前為key,那麼轉換後就是乙個整數h key 常見的雜湊函式有直接位址法 平方取中法 除留餘數法等。其中,直接位址法是指恒等變換h key...