哈希算法的用途
什么是哈希算法
一說到哈希算法, 我瞬間就想到了哈希函數(shù)、哈希表, 其實(shí)他們并不是一回事.
簡單來說, 哈希算法就是將任意長度的字符串通過計(jì)算轉(zhuǎn)換為固定長度的字符串, 不對, 不光字符串, 應(yīng)該說是將任意長度的二進(jìn)制串轉(zhuǎn)換為固定長度的二進(jìn)制串, 這個(gè)轉(zhuǎn)換的過程就是哈希算法.
既然將任意長度的字符串轉(zhuǎn)換成固定長度的, 那么沖突就不可避免了, 比如將0-100所有的數(shù)字, 映射到0-10這十個(gè)數(shù)字上, 難免會(huì)發(fā)生沖突. 一般來說, 計(jì)算得出的哈希值越長, 沖突的概率就越低, 比如說, 計(jì)算過后, 哈希值為16個(gè)字節(jié), 也就是128位, 那么就有2^128個(gè)不同的哈希值, 發(fā)生哈希沖突的概率為(1/2)^128, 這個(gè)概率可以說很低了.
以MD5為例, 以下是經(jīng)過MD5轉(zhuǎn)換后的值:
朋友你好: 677fe16950241e74ef632efb2b9f92a7
朋友你好!: 6efa551df87d9de987f17be4e73eb720
可以看到, 哪怕僅僅差了一個(gè)感嘆號(hào), 計(jì)算后的值也是天壤之別, 所以很多網(wǎng)站上下載文件的同時(shí)還提供md5值, 現(xiàn)在能夠理解了吧, 你將下載后的文件通過md5算法進(jìn)行計(jì)算, 得到的字符串如果和網(wǎng)站給定的不相同, 說明文件被修改過了.
當(dāng)然, 哈希算法不僅僅只有md5這一種, 以用途來分析哈希算法, 就不說哈希算法的原理了, 因?yàn)槲也粫?huì).
1. 數(shù)據(jù)校驗(yàn)
上面說到的md5就是其中的一個(gè), 好像還有一個(gè)什么SHA, 不過我不知道, 也就不展開探討了.
md5可以將一個(gè)文件經(jīng)過計(jì)算轉(zhuǎn)換成一個(gè)指定長度的字符串, 可以防止文件被篡改, 但是通過加密后的字符串很難逆向推出原文.
前面那個(gè)例子可以看到, 即使文件被修改了一點(diǎn)點(diǎn), 也會(huì)導(dǎo)致計(jì)算后的值發(fā)生很大變換.
2.唯一標(biāo)識(shí)
比如說, 現(xiàn)在有十萬個(gè)文件, 給你一個(gè)文件, 要你在這十萬個(gè)文件中查找是否存在. 一個(gè)很笨的辦法就是把每一文件都拿出來, 然后按照二進(jìn)制串一一進(jìn)行對比. 但是這個(gè)操作注定是比較費(fèi)時(shí)的.
可以用哈希算法對文件進(jìn)行計(jì)算, 然后比較哈希值是否相同. 因?yàn)榇嬖诠_突的情況, 你可以在相同哈希值的文件再進(jìn)行二進(jìn)制串比較.
3.哈希表
在哈希表中使用哈希函數(shù)已經(jīng)并不陌生了, 不再贅述.
4.負(fù)載均衡
比如說, 現(xiàn)在又多臺(tái)服務(wù)器, 來了一個(gè)請求, 如何確定這個(gè)請求應(yīng)該路由到哪個(gè)路由器呢?當(dāng)然, 必須確保相同的請求經(jīng)過路由到達(dá)同一個(gè)服務(wù)器. 一種辦法就是保存一張路由關(guān)系的表, 比如客戶端IP和服務(wù)器編號(hào)的映射, 但是如果客戶端很多, 勢必查找的時(shí)間會(huì)很長. 這時(shí), 可以將客戶端的唯一標(biāo)識(shí)信息(如:IP、username等)進(jìn)行哈希計(jì)算, 然后與服務(wù)器個(gè)數(shù)取模, 得到的就是服務(wù)器的編號(hào).
5.分布式存儲(chǔ)
當(dāng)我們有大量數(shù)據(jù)時(shí), 一般會(huì)選擇將數(shù)據(jù)存儲(chǔ)到多個(gè)服務(wù)器, 為了提高讀取與寫入的速度嘛. 決定將文件存儲(chǔ)到哪臺(tái)服務(wù)器, 就可以通過哈希算法取模的操作來得到.
但是, 如果數(shù)據(jù)多了, 要增加服務(wù)器了, 問題就來了, 比如原來是10臺(tái)服務(wù)器, 現(xiàn)在變成15臺(tái)了, 那么原來哈希值為16的文件被分配到編號(hào)6的服務(wù)器, 現(xiàn)在被分配到編號(hào)1的服務(wù)器, 也就意味著所有文件都要重新計(jì)算哈希值并重新非陪服務(wù)器進(jìn)行存儲(chǔ). 一致性哈希就是這個(gè)用途, 可以查找我的歷史文章.
暫時(shí)我能想到的就只有這些, 當(dāng)然, 哈希算法的用途還有很多, git中的commit id等, 但是我不太了解, 就假裝沒有吧, 嘿嘿
有時(shí)對用戶的密碼進(jìn)行MD5加密再保存, 確實(shí)要比明文保存好的多. 但是, 你以為通過哈希算法進(jìn)行加密就萬事大吉了么? 不好意思, 并不能, 像前面提到的MD5就已經(jīng)號(hào)稱別破解了.
比如, 你將用戶的密碼進(jìn)行MD5加密后進(jìn)行保存, 若有心人拿到你的數(shù)據(jù)庫數(shù)據(jù), 雖然得到的是加密后的密碼, 但是只要準(zhǔn)備一個(gè)常用密碼的字典, 將字典中的密碼進(jìn)行加密后與數(shù)據(jù)庫保存的數(shù)據(jù)進(jìn)行比較, 如果相同, 基本上就可以確定了.
我感覺可以對密碼進(jìn)行雙層加密, 也就是使用兩個(gè)不同的加密算法, 一個(gè)算法的輸出作為另一個(gè)的輸入, 增大一些破解的難度吧.
再見!!!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: html5调用系统声音1s响一次_20款
- 下一篇: 活在幻梦中的你我