定義將任意長度的二進位制值串對映成固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制值串就是雜湊值。
如何設計乙個優秀的雜湊演算法?
1)單向雜湊:
從雜湊值不能反向推導出雜湊值(所以雜湊演算法也叫單向雜湊演算法)。
2)篡改無效:
對輸入敏感,哪怕原始資料只修改乙個bit,最後得到的雜湊值也大不相同。
3)雜湊衝突:
雜湊衝突的概率要很小,對於不同的原始資料,雜湊值相同的概率非常小。
4)執行效率:
雜湊演算法的執行效率要盡量高效,針對較長的文字,也能快速計算雜湊值。
7個常見應用:安全加密、唯一標識、資料校驗、雜湊函式、負載均衡、資料分片、分布式儲存。
安全加密
1)常用於加密的雜湊演算法:
md5:md5 message-digest algorithm,md5訊息摘要演算法
sha:secure hash algorithm,安全雜湊演算法
des:data encryption standard,資料加密標準
aes:advanced encryption standard,高階加密標準
2)對用於加密的雜湊演算法,有兩點格外重要,第一點是很難根據雜湊值反向推導出原始資料,第二點是雜湊衝突的概率要小。
3)在實際開發中要權衡破解難度和計算時間來決定究竟使用哪種加密演算法。
唯一標識
通過雜湊演算法計算出資料的唯一標識,從而用於高效檢索資料。
資料校驗
利用雜湊演算法對輸入資料敏感的特點,可以對資料取雜湊值,從而高效校驗資料是否被篡改過。
雜湊函式
雜湊函式中用到的雜湊演算法更加關注雜湊後的值能不能平均分布,以及雜湊函式的執行快慢。
負載均衡(雜湊演算法代替對映表)
【需求】
如何實現乙個會話粘滯(session sticky)的負載均衡演算法?也就是說,在一次會話中的所有請求都路由到同乙個伺服器上。
【解決方案】
通過雜湊演算法對客戶端ip或會話id計算雜湊值,將取得的雜湊值與伺服器列表的大小進行取模運算,最終得到的值就是應該被路由到的伺服器編號。這樣,就可以把同乙個ip過來的請求都路由到同乙個後端伺服器上。
如何防止資料庫中的使用者資訊被脫庫?你會如何儲存使用者密碼這麼重要的資料嗎?
答:1)使用md5進行加密
2)字典攻擊:如果使用者資訊被「脫庫」,黑客雖然拿到的是加密之後的密文,但可以通過「猜」的方式來破解密碼,這是因為,有些使用者的密碼太簡單。
3)針對字典攻擊,我們可以引入乙個鹽(salt),跟使用者密碼組合在一起,增加密碼的複雜度。
現在,區塊鏈是乙個很火的領域,它被很多人神秘化,不過其底層的實現原理並不複雜。其中,雜湊演算法就是它的乙個非常重要的理論基礎。你能講一講區塊鏈使用的是哪種雜湊演算法嗎?是為了解決什麼問題而使用的呢?
答:區塊鏈是一塊塊區塊組成的,每個區塊分為兩部分:區塊頭和區塊體。
區塊頭儲存著 自己區塊體 和 上乙個區塊頭 的雜湊值。
因為這種鏈式關係和雜湊值的唯一性,只要區塊鏈上任意乙個區塊被修改過,後面所有區塊儲存的雜湊值就不對了。
區塊鏈使用的是 sha256 雜湊演算法,計算雜湊值非常耗時,如果要篡改乙個區塊,就必須重新計算該區塊後面所有的區塊的雜湊值,短時間內幾乎不可能做到。
雜湊演算法還有很多其他的應用,比如網路協議中的 crc 校驗、git commit id 等等。除了這些,你還能想到其他用到雜湊演算法的地方嗎?
王爭老師在極客時間的專欄《資料結構與演算法之美》
《演算法與資料結構》學習筆記18 雜湊演算法
啊,繼續學習之旅。前面幾篇提到 雜湊表 雜湊函式 這裡又講到 雜湊演算法 是不是有點一頭霧水?實際上,不管是 雜湊 還是 雜湊 這都是中文翻譯的差別,英文其實就是 hash 所以,常聽到有人把 雜湊表 叫作 雜湊表 hash 表 把 雜湊演算法 叫作 hash 演算法 或者 雜湊演算法 什麼是雜湊演...
查詢演算法 雜湊演算法,雜湊表查詢
那麼問題來了,如果集合s中同時存在值k 16和值k 27,我們該如何將兩個位址一樣的值存入雜湊表呢?常用的雜湊函式 處理衝突的方法 2.連位址法 雜湊表涉及的是一種對映關係,可以根據某個值查詢到關鍵字的位址,這樣的做法省去了比較的時間,優化了演算法。雜湊表是把值 關鍵字 存到跟它具有 唯一 對映的格...
雜湊函式 雜湊函式 演算法
常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rshash,sdbmhash,pjwhash,elfhash等等。c 實現 include define m 249997 define m1 1000003 define m2 10000019 大素數 using ...