乙個優秀的 hash 演算法,將能實現:
但在不同的使用場景中,如資料結構和安全領域裡,其中對某一些特點會有所側重。
2.2.1 hash在管理資料結構中的應用
在用到hash進行管理的資料結構中,就對速度比較重視,對抗碰撞不太看中,只要保證hash均勻分布就可以。比如hashmap,hash值(key)存在的目的是加速鍵值對的查詢,key的作用是為了將元素適當地放在各個桶裡,對於抗碰撞的要求沒有那麼高。換句話說,hash出來的key,只要保證value大致均勻的放在不同的桶裡就可以了。但整個演算法的set效能,直接與hash值產生的速度有關,所以這時候的hash值的產生速度就尤為重要,以jdk中的string.hashcode()方法為例:
public int
hashcode()
hash = h;
}return h;
}
很簡潔的乙個乘加迭代運算,在不少的hash演算法中,使用的是異或+加法進行迭代,速度和前者差不多。
2.2.2 hash在在密碼學中的應用
在密碼學中,hash演算法的作用主要是用於訊息摘要和簽名,換句話說,它主要用於對整個訊息的完整性進行校驗。舉個例子,我們登陸知乎的時候都需要輸入密碼,那麼知乎如果明文儲存這個密碼,那麼黑客就很容易竊取大家的密碼來登陸,特別不安全。那麼知乎就想到了乙個方法,使用hash演算法生成乙個密碼的簽名,知乎後台只儲存這個簽名值。由於hash演算法是不可逆的,那麼黑客即便得到這個簽名,也絲毫沒有用處;而如果你在**登陸介面上輸入你的密碼,那麼知乎後台就會重新計算一下這個hash值,與**中儲存的原hash值進行比對,如果相同,證明你擁有這個賬戶的密碼,那麼就會允許你登陸。銀行也是如此,銀行是萬萬不敢儲存使用者密碼的原文的,只會儲存密碼的hash值而而已。在這些應用場景裡,對於抗碰撞和抗篡改能力要求極高,對速度的要求在其次。乙個設計良好的hash演算法,其抗碰撞能力是很高的。以md5為例,其輸出長度為128位,設計預期碰撞概率為1/2128,這是乙個極小極小的數字——而即便是在md5被王小雲教授破解之後,其碰撞概率也非常低。而對於兩個相似的字串,md5加密結果如下:
md5("version1") = "966634ebf2fc135707d6753692bf4b1e";
md5("version2") = "2e0e95285f08a07dea17e7ee111b21c8"
可以看到僅僅乙個位元位的改變,二者的md5值就天差地別了.
ps :其實把hash演算法當成是一種加密演算法,這是不準確的,我們知道加密總是相對於解密而言的,沒有解密何談加密呢,hash的設計以無法解為目的的。並且如果我們不附加乙個隨機的salt值,hash口令是很容易被字典攻擊入侵的。
hash表 hash演算法
概念 雜湊表 hash table。也叫雜湊表 是依據關鍵碼值 key value 而直接進行訪問的 資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。給定表m,存在函式f key 對隨意給定的keyword值ke...
HASH函式的特點及其應用
hash函式必須具備兩個基本特徵 單向性 和 碰撞約束。單向性是指其的操作方向的不可逆性,在hash函式中是指 只能從輸入推導出輸出,而不能從輸出計算出輸入 碰撞約束是指 不能找到乙個輸入使其輸出結果等於乙個已知的輸出結果 或者 不能同時找到兩個不同的輸入使其輸出結果完全一致。乙個函式只用同時嚴格的...
hash位址 Hash演算法基礎
hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入值。簡單的說就是一種將任意長度的訊...