雜湊演算法的定義和原理⾮常簡單,基本上⼀句話就可以概括了。將任意⻓度的⼆進位制值串對映為固定⻓度的⼆進位制值串,這個對映的規則就是雜湊演算法。⽽通過原始資料對映之後得到的⼆進位制值串就是雜湊值。但是,要想設計⼀個優秀的雜湊演算法並不 容易,根據我的經驗,我總結了需要滿⾜的⼏點要求:
1.從雜湊值不能反向推匯出原始資料(所以雜湊演算法也叫單向雜湊演算法);
2.對輸⼊資料⾮常敏感,哪怕原始資料只修改了⼀個Bit,最後得到的雜湊值也⼤不相同;
3.雜湊衝突的概率要很⼩,對於不同的原始資料,雜湊值相同的概率⾮常⼩;
4.雜湊演算法的執⾏效率要儘量⾼效,針對較⻓的⽂本,也能快速地計算出雜湊值。
以MD5雜湊演算法為例:
我們分別對“今天我來講雜湊演算法”和“jiajia”這兩個⽂本,計算MD5雜湊值,得到兩串看起來毫⽆規律的字串(MD5的雜湊值是128位的Bit⻓度,為了⽅便表示,我把它們轉化成了16進位制編碼)。可以看出來,⽆論要雜湊的⽂本有多⻓、多短,通過MD5雜湊之後,得到的雜湊值的⻓度都是相同的,⽽且得到的雜湊值看起來像⼀堆隨機數,完全沒有規律。
MD5(“今天我來講雜湊演算法”) = bb4767201ad42c74e650c1b6c03d78fa
MD5(“jiajia”) = cd611a31ea969b908932d44d126d195b
我們再來看兩個⾮常相似的⽂本,“我今天講雜湊演算法!”和“我今天講雜湊演算法”。這兩個⽂本只有⼀個感嘆號的區別。如果⽤MD5雜湊演算法分別計算它們的雜湊值,你會發現,儘管只有⼀字之差,得到的雜湊值也是完全不同的。
MD5(“我今天講雜湊演算法!”) = 425f0d5a917188d2c3c3dc85b5e4f2cb
MD5(“我今天講雜湊演算法”) = a1fb91ac128e6aa37fe42c663971ac3d
通過雜湊演算法得到的雜湊值,很難反向推匯出原始資料。⽐如上⾯的例⼦中,我們就很難通過雜湊值“a1fb91ac128e6aa37fe42c663971ac3d”反推出對應的⽂本“我今天講雜湊演算法”。
雜湊演算法的應⽤
應⽤⼀:安全加密
應⽤⼆:唯⼀標識
應⽤三:資料校驗
應⽤四:雜湊函式
應⽤五:負載均衡
應⽤六:資料分⽚
應⽤七:分散式儲存
本作品採用《CC 協議》,轉載必須註明作者和本文連結