哈希算法

哈希算法算法

哈希算法

什麼是哈希算法

  • 從哈希值不能反向推導出原始數據(因此哈希算法也叫單向哈希算法)數據庫

  • 對輸入數據很是敏感,哪怕原始數據只修改了一個Bit,最後獲得的哈希值也大不相同後端

  • 散列衝突的機率要很小,對於不一樣的原始數據,哈希值相同的機率很是小緩存

  • 哈希算法的執行效率要儘可能高效,針對較長的文本,也能快速地計算出哈希值。安全

哈希算法的應用

應用一:安全加密

說到哈希算法的應用,最早想到的應該就是安全加密。最經常使用於加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。服務器

對用於加密的哈希算法來講,有兩點格外重要。第一點是很難根據哈希值反向推導出原始數據,第二點是散列衝突的機率要很小。session

第一點很好理解,加密的目的就是防止原始數據泄露,因此很難經過哈希值反向推導原始數據,這是一個最基本的要求。因此我着重講一下第二點。實際上,不論是什麼哈希算法,咱們只能儘可能減小碰撞衝突的機率,理論上是沒辦法作到徹底不衝突的。負載均衡

沒有絕對安全的加密。越複雜、越難破解的加密算法,須要的計算時間也越長。好比SHA-256比SHA-1要更復雜、更安全,相應的計算時間就會比較長。密碼學界也一直致力於找到一種快速而且很難被破解的哈希算法。咱們在實際的開發過程當中,也須要權衡破解難度和計算時間,來決定究竟使用哪一種加密算法。分佈式

應用二:惟一標識

咱們能夠給每個圖片取一個惟一標識,或者說信息摘要。好比,咱們能夠從圖片的二進制碼串開頭取100個字節,從中間取100個字節,從最後再取100個字節,而後將這300個字節放到一塊,經過哈希算法(好比MD5),獲得一個哈希字符串,用它做爲圖片的惟一標識。經過這個惟一標識來斷定圖片是否在圖庫中,這樣就能夠減小不少工做量。函數

若是還想繼續提升效率,咱們能夠把每一個圖片的惟一標識,和相應的圖片文件在圖庫中的路徑信息,都存儲在散列表中。當要查看某個圖片是否是在圖庫中的時候,咱們先經過哈希算法對這個圖片取惟一標識,而後在散列表中查找是否存在這個惟一標識。

應用三:數據校驗

咱們經過哈希算法,對100個文件塊分別取哈希值,而且保存在種子文件中。咱們在前面講過,哈希算法有一個特色,對數據很敏感。只要文件塊的內容有一丁點兒的改變,最後計算出的哈希值就會徹底不一樣。因此,當文件塊下載完成以後,咱們能夠經過相同的哈希算法,對下載好的文件塊逐一求哈希值,而後跟種子文件中保存的哈希值比對。若是不一樣,說明這個文件塊不完整或者被篡改了,須要再從新從其餘宿主機器上下載這個文件塊。

應用四:負載均衡

咱們知道,負載均衡算法有不少,好比輪詢、隨機、加權輪詢等。那如何才能實現一個會話粘滯(session sticky)的負載均衡算法呢?也就是說,咱們須要在同一個客戶端上,在一次會話中的全部請求都路由到同一個服務器上。

最直接的方法就是,維護一張映射關係表,這張表的內容是客戶端IP地址或者會話ID與服務器編號的映射關係。客戶端發出的每次請求,都要先在映射表中查找應該路由到的服務器編號,而後再請求編號對應的服務器。

若是藉助哈希算法,這些問題均可以很是完美地解決。咱們能夠經過哈希算法,對客戶端IP地址或者會話ID計算哈希值,將取得的哈希值與服務器列表的大小進行取模運算,最終獲得的值就是應該被路由到的服務器編號。 這樣,咱們就能夠把同一個IP過來的全部請求,都路由到同一個後端服務器上。

應用五:數據分片

假如咱們有1T的日誌文件,這裏面記錄了用戶的搜索關鍵詞,咱們想要快速統計出每一個關鍵詞被搜索的次數,該怎麼作呢?

咱們來分析一下。這個問題有兩個難點,第一個是搜索日誌很大,沒辦法放到一臺機器的內存中。第二個難點是,若是隻用一臺機器來處理這麼巨大的數據,處理時間會很長。

針對這兩個難點,咱們能夠先對數據進行分片,而後採用多臺機器處理的方法,來提升處理速度。具體的思路是這樣的:爲了提升處理的速度,咱們用n臺機器並行處理。咱們從搜索記錄的日誌文件中,依次讀出每一個搜索關鍵詞,而且經過哈希函數計算哈希值,而後再跟n取模,最終獲得的值,就是應該被分配到的機器編號。

這樣,哈希值相同的搜索關鍵詞就被分配到了同一個機器上。也就是說,同一個搜索關鍵詞會被分配到同一個機器上。每一個機器會分別計算關鍵詞出現的次數,最後合併起來就是最終的結果。

實際上,這裏的處理過程也是MapReduce的基本設計思想,針對這種海量數據的處理問題,咱們均可以採用多機分佈式處理。藉助這種分片的思路,能夠突破單機內存、CPU等資源的限制。。

應用六:分佈式存儲

在數據增長鬚要擴充機器時:原來的數據是經過與10來取模的。好比13這個數據,存儲在編號爲3這臺機器上。可是新加了一臺機器中,咱們對數據按照11取模,原來13這個數據就被分配到2號這臺機器上了。

  

所以,全部的數據都要從新計算哈希值,而後從新搬移到正確的機器上。這樣就至關於,緩存中的數據一會兒就都失效了。全部的數據請求都會穿透緩存,直接去請求數據庫。這樣就可能發生雪崩效應,壓垮數據庫。

因此,咱們須要一種方法,使得在新加入一個機器後,並不須要作大量的數據搬移。這時候,一致性哈希算法就要登場了。

假設咱們有k個機器,數據的哈希值的範圍是[0, MAX]。咱們將整個範圍劃分紅m個小區間(m遠大於k),每一個機器負責m/k個小區間。當有新機器加入的時候,咱們就將某幾個小區間的數據,從原來的機器中搬移到新的機器中。這樣,既不用所有從新哈希、搬移數據,也保持了各個機器上數據數量的均衡。

相關文章
相關標籤/搜索