一、定義
1、將任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法。通過原始資料對映之後得到的二進位制值串就是雜湊值。
二、hash演算法編寫要求
從雜湊值不能反向推導出原始資料
對輸入資料非常敏感,哪怕原始資料只修改了乙個bit,最後得到的hash值也會變化
雜湊衝突的概率很小,對於不同的原始資料,雜湊值相同的概率非常小
雜湊演算法的執行效率要盡量高效,針對較長的文字,也能盡快的計算出
三、示例
例如』md5資訊摘要演算法
兩個字串只差了個尾字元,但是結果相差很大。
無論被加密字元長度多少,加密後結果長度都相同
四、hash演算法應用
安全加密
對於加密演算法有兩點要求
1、根據雜湊值很難反向推導資料
2、雜湊衝突的概率要很小
目前比較常用的是md5資訊摘要演算法,和sha安全雜湊演算法,據說md5與sha-1已經被破解,據我所知md5的破解並不是反向推導出資料,而是找到雜湊衝突。理想狀態是已知md5(a)由此構造出b,使md5(a)=mad5(b)。但現在做到的是已知a,可以構造資訊ab,ac,使得md5(ab)=md5(ac)。現在所有破解md5基本都是用到彩虹對照表,或者碰撞等。
那麼為什麼雜湊演算法無法做到零衝突呢!
根據之前學習雜湊表的知識我們知道,雜湊值的長度是固定且有限的,比如md5
最多能表示2^128個資料,而我們需要轉換的值是無窮的。所以第2^128+1個資料求雜湊值時,必會與之前的2^128某個資料重複。理論上來說雜湊值越長,雜湊衝突的機率越小。
3、密碼儲存
前一陣facebook儲存了多達6億個沒有加密的使用者帳戶密碼,此訊息一出給fecebook弄出很多麻煩。密碼以明文的方式儲存安全風險會很大。那怎麼規避呢,用密文的方式儲存。比如md5加密,當然這也不是萬無一失的。那就再增加點難度。給密碼加上固定字元再用雜湊演算法算出雜湊值,如果通過就減去固定字元再換另一種雜湊演算法計算雜湊值運算。任何安全加密都不是保證安全的。只不過是在增加破解的成本。如果你能讓破解的成本高於資料的價值,那麼一定程度上來說你的資料是安全的.
唯一標識
例如檔案監控,讀取檔案,並將檔案進行雜湊演算法加密。這樣就能發現是否新增或者修改過
判斷是否重複,將每個的二進位制編碼進行雜湊演算法加密。入庫時判斷md5是否有重複即可
資料校驗
雜湊函式
5、負載均衡
想要做到會話粘滯的負載均衡的話(同意客戶端,所有會話請求都路由到同乙個伺服器上),簡單的方法就是做個對映表,對應使用者id與伺服器編號。這樣的方法又兩個缺陷,對映表過大的話會占用過多記憶體空間,不容易維護。
我們可以通過雜湊演算法,對客戶端ip計算雜湊值,然後與伺服器列表取模,得到的值就是應該路由到的伺服器編號。
6、資料分片
唯一標識那段說過的重複判斷,如果有一億張無法存到乙個資料庫怎麼辦,解決辦法就是將資料分片儲存。準備n臺伺服器,用雜湊演算法將計算雜湊值,然後模n,將其存入對應的伺服器再判斷是否重複。
7、分布式儲存
如果用hash演算法對資料進行分布式儲存是,這樣可以很好地做到負載均衡。但是問題來了如果對集群進行擴容時,就需要對之前已經儲存的資料重新進行取模運算。比如集群初始狀態為五颱機器。後來進行擴容後為11臺機器,這時候就要對集群內的資料重新的進行運算,以便達到負載均衡的目地。這樣就相當於,快取中的資料一下子就都失效了。所有的資料請求都會穿透快取,直接去請求資料庫。這樣就可能發生雪崩效應,壓垮資料庫。我們用到一致性雜湊演算法來解決該問題。
一致性雜湊演算法就是。之前hash演算法是對機器個數取模,一致性就是開闢出遠大於機器個數的小區間,對這些小區間進行取模運算然後,將小區間平均分配到機器上,每台機器上的小區間的個數為。小區間數量/機器數量。如果擴容時只需間某些小區間內的資料遷移到新的機器中。
資料結構和演算法 雜湊演算法
前面我們學習了雜湊表,雜湊函式,和雜湊演算法啥關係?其實不管雜湊還是雜湊,都是翻譯的差別,對於英文都是hash,所以雜湊 雜湊 hash 雜湊演算法的定義 將任意長度的二進位制串對映為固定長度的二進位制串,這種對映規則就是雜湊演算法。通過原始資料對映成的規定固定長度的二級制串就是雜湊值乙個優秀的雜湊...
資料結構 雜湊演算法
最近開始學習王爭老師的 資料結構與演算法之美 通過總結再加上自己的思考的形式記錄這門課程,文章主要作為學習歷程的記錄。雜湊演算法的定義是將任意長度的二進位制值串對映為固定長度的二進位制值串。這個對映規則就是雜湊演算法。通過原始資料對映後得到的二進位制值串就是雜湊值。設計乙個優秀的雜湊演算法應滿足幾點...
資料結構和演算法 刷題 雜湊演算法
nums1 1,2,2,1 nums2 2,2 返回 2,2 雜湊是一種查詢演算法 from collections import counter from collections import defaultdict 不存在的key時 返回預設值 from collections import o...