我也不是專業的,請帶着思考閱讀.
還有就是,文中的白話,別杠.
關鍵字:
不可逆
、hash
、散列
0.背景
接下來討論的幾節內容,是由下面這張圖擴展開來.
1.散列
散列就是不可逆算法的實現.
類似於指紋,每個人都有一個獨特的指紋,人不同,指紋也就不同.
在計算機的世界里,每個文件也可以有自己的一個散列值,字符串、視頻、語音等等都可以轉換成二進制的數據,他們都能擁有自己的散列值,每個文件的散列值同樣可以是獨一無二的.
散列是一種不可逆運算,通過輸入x,通過一定的函數運算,可以得到一個結果y.當x固定時,輸出的y也總是固定的.
日常生活中,像什么hash、不可逆運算等等,你都可以簡單的理解為散列.
它具有以下特點:
- 固定大小
- 雪崩效應
- 單向
- 沖突避免
2 特點
要設計一個良好的Hash算法,應該滿足以下要求.
2.1 固定大小
不管多大的數據,得出的hash值長度都是一樣的.
看下圖這個漏斗,我們可以形象的理解為,不管多大的東西進去,出來的值總是固定大小的.
不同的散列算法,得出的散列值長度是不一樣的,如MD5為128bit.

2.2 雪崩效應
稍微修改一點,哪怕是小小的1bit,得出的hash值都是截然不同的.
類似於雙胞胎,看起來哪里都一樣,但是指紋確實完全不同的.
2.3 單向
拿着指紋反向推導出這個人,是一件困難的工作.
我們可以通過入參x計算出hash值y,但是反向推導是不可行的,即不能通過hash結果y輕易計算出源數據x.
2.4 沖突避免
對於不同的文件,我們應該盡量確保計算出的hash值是不一樣的.
對於輸入的數據,如果你的hash算法結果很容易一樣,這並不符合我們的要求.
我們要盡量去確保散列算法能避免沖突,但是能完全避免也是不合理的.
以MD5為例,入參是整個宇宙,但是結果總歸只有那么128位,是可能存在入參不同但是hash值卻相同的情況.
3 實例
網上下文件的時候,經常看到后面一個什么MD5值,SHA值,為啥要寫個這個?
下載下來文件后,你可以拿相應的計算工具去計算這個文件的MD5值,如果傳輸過程中文件有損壞/修改,得出的MD5值將會不一樣.
這樣,我們就能確保下載下來的文件跟官網的文件是完全一樣的.
那玩意數據庫里的密碼竟然存的是HASH值?
由於不可逆的特性,你破解數據庫拿到數據后,看到一堆hash值,也很難猜到真實的用戶密碼.
那我存成hash值,怎么知道用戶輸入的明文密碼對不對啊?
拿到密碼計算hash值,跟庫里面的hash值一樣,那不就對了嗎.
4 擴展
由於算法是單向的,我們很難通過hash值反向得出源數據.像上面這個密碼的場景,有心人可以存一個密碼庫.
記錄下常見的"源數據-hash值",我拿着hash值查表,這不把密碼找到了嗎?
所以呀,讓你不要用常見的密碼,給你整個hash騙騙眼睛又怎么樣,hash值都被別人存起來了.
只要咱的庫夠全,你的hash值我也有機會找到.