1.哈希算法介紹
將任意長度的二進制值串映射為固定長度的二進制值串,該映射的規則就是哈希算法。
2.哈希算法滿足條件
1.從哈希值不能反向推導出原始數據(哈希算法,單向哈希算法) 2.對輸入數據非常敏感,哪怕原始數據只修改了一個bit,最后得到的哈希值也大不相同 3.散列沖突的概率要很小,對於不同的原始數據,哈希值相同的概率非常小 4.哈希算法的執行效率要盡量高,針對較長的文本,能夠快速計算出哈希值
3.哈希算法應用場景
3.1.安全加密
最常用的加密的哈希算法是MD5(MD5消息摘要算法)和SHA(安全散列算法)。對於加密來說,兩個方面比較重要: 1.很難根據哈希值反向推到出原始數據(加密的目的就是防止原始數據泄露) 2.盡量減少碰撞沖突概率(理論上沒有辦法做到完全不沖突)。這里可以了解鴿巢原理,假如有10個鴿巢,卻有11只鴿子。 在實際項目中,為了更加保障數據安全,使用原始數據+鹽(salt)方式,一起計算哈希值的方式
3.2.唯一標識
如果要在海量圖庫中,搜索某張圖片是否存在。是否可以直接通過圖片的元信息(比如圖片名稱)進行比對?
答案是:不能。因為可能存在名稱相同,但是圖片內容不同;或者名稱不同,但是圖片內容相同的情況。
那么該如何實現搜索呢?
答案:獲取圖片的二進制信息(二進制碼串開頭取100個字節+中間取100個字節+最后取100個字節),將拼接在一起的300個字節通過哈希算法,得到哈希值。作為圖片的唯一標識即可。
3.3.數據校驗
電驢這樣的 BT 下載軟件我們都有用過。我們知道,BT 下載的原理是基於 P2P 協議的。我們從多個機器上並行下載一個 2GB 的電影,這個電影文件可能會被分割成很多文件塊(比如可以分成 100 塊,每塊大約 20MB)。等所有的文件塊都下載完成之后,再組裝成一個完整的電影文件就行了。 我們知道,網絡傳輸是不安全的,下載的文件塊有可能是被宿主機器惡意修改過的,又或者下載過程中出現了錯誤,所以下載的文件塊可能不是完整的。如果我們沒有能力檢測這種惡意修改或者文件下載出錯,就會導致最終合並后的電影無法觀看,甚至導致電腦中毒。 現在的問題是,如何來校驗文件塊的安全、正確、完整呢? 我們通過哈希算法,對 100 個文件塊分別取哈希值,並且保存在種子文件中。哈希算法有一個特點,對數據很敏感。只要文件塊的內容有一丁點兒的改變,最后計算出的哈希值就會完全不同。 所以,當文件塊下載完成之后,我們可以通過相同的哈希算法,對下載好的文件塊逐一求哈希值,然后跟種子文件中保存的哈希值比對。如果不同,說明這個文件塊不完整或者被篡改了,需要再重新從其他宿主機器上下載這個文件塊。