哈希算法的用途

什麼是哈希算法

一說到哈希算法, 我瞬間就想到了哈希函數、哈希表, 其實他們並非一回事. git

簡單來講, 哈希算法就是將任意長度的字符串經過計算轉換爲固定長度的字符串, 不對, 不光字符串, 應該說是將任意長度的二進制串轉換爲固定長度的二進制串, 這個轉換的過程就是哈希算法. 算法

既然將任意長度的字符串轉換成固定長度的, 那麼衝突就不可避免了, 好比將0-100全部的數字, 映射到0-10這十個數字上, 不免會發生衝突. 通常來講, 計算得出的哈希值越長, 衝突的機率就越低, 好比說, 計算事後, 哈希值爲16個字節, 也就是128位, 那麼就有2^128個不一樣的哈希值, 發生哈希衝突的機率爲(1/2)^128, 這個機率能夠說很低了. 數據庫

以MD5爲例, 如下是通過MD5轉換後的值: 服務器

朋友你好: 677fe16950241e74ef632efb2b9f92a7負載均衡

朋友你好!: 6efa551df87d9de987f17be4e73eb720分佈式

能夠看到, 哪怕僅僅差了一個感嘆號, 計算後的值也是天壤之別, 因此不少網站上下載文件的同時還提供md5值, 如今可以理解了吧, 你將下載後的文件經過md5算法進行計算, 獲得的字符串若是和網站給定的不相同, 說明文件被修改過了. 函數

固然, 哈希算法不只僅只有md5這一種, 以用途來分析哈希算法, 就不說哈希算法的原理了, 由於我不會. 網站

1. 數據校驗加密

上面說到的md5就是其中的一個, 好像還有一個什麼SHA, 不過我不知道, 也就不展開探討了. spa

md5能夠將一個文件通過計算轉換成一個指定長度的字符串, 能夠防止文件被篡改, 可是經過加密後的字符串很難逆向推出原文.

前面那個例子能夠看到, 即便文件被修改了一點點, 也會致使計算後的值發生很大變換.

2.惟一標識

好比說, 如今有十萬個文件, 給你一個文件, 要你在這十萬個文件中查找是否存在. 一個很笨的辦法就是把每一文件都拿出來, 而後按照二進制串一一進行對比. 可是這個操做註定是比較費時的.

能夠用哈希算法對文件進行計算, 而後比較哈希值是否相同. 由於存在哈希衝突的狀況, 你能夠在相同哈希值的文件再進行二進制串比較.

3.哈希表

在哈希表中使用哈希函數已經並不陌生了, 再也不贅述.

4.負載均衡

好比說, 如今又多臺服務器, 來了一個請求, 如何肯定這個請求應該路由到哪一個路由器呢?固然, 必須確保相同的請求通過路由到達同一個服務器. 一種辦法就是保存一張路由關係的表, 好比客戶端IP和服務器編號的映射, 可是若是客戶端不少, 勢必查找的時間會很長. 這時, 能夠將客戶端的惟一標識信息(如:IP、username等)進行哈希計算, 而後與服務器個數取模, 獲得的就是服務器的編號.

5.分佈式存儲

當咱們有大量數據時, 通常會選擇將數據存儲到多個服務器, 爲了提升讀取與寫入的速度嘛. 決定將文件存儲到哪臺服務器, 就能夠經過哈希算法取模的操做來獲得.

可是, 若是數據多了, 要增長服務器了, 問題就來了, 好比原來是10臺服務器, 如今變成15臺了, 那麼原來哈希值爲16的文件被分配到編號6的服務器, 如今被分配到編號1的服務器, 也就意味着全部文件都要從新計算哈希值並從新非陪服務器進行存儲. 一致性哈希就是這個用途, 能夠查找個人歷史文章.

暫時我能想到的就只有這些, 固然, 哈希算法的用途還有不少, git中的commit id等, 可是我不太瞭解, 就僞裝沒有吧, 嘿嘿


有時對用戶的密碼進行MD5加密再保存, 確實要比明文保存好的多. 可是, 你覺得經過哈希算法進行加密就萬事大吉了麼? 很差意思, 並不能, 像前面提到的MD5就已經號稱別破解了.

好比, 你將用戶的密碼進行MD5加密後進行保存, 如有心人拿到你的數據庫數據, 雖然獲得的是加密後的密碼, 可是隻要準備一個經常使用密碼的字典, 將字典中的密碼進行加密後與數據庫保存的數據進行比較, 若是相同, 基本上就能夠肯定了.

我感受能夠對密碼進行雙層加密, 也就是使用兩個不一樣的加密算法, 一個算法的輸出做爲另外一個的輸入, 增大一些破解的難度吧.

再見!!!

相關文章
相關標籤/搜索