日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈希算法的用途

發(fā)布時(shí)間:2024/8/23 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈希算法的用途 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是哈希算法

一說到哈希算法, 我瞬間就想到了哈希函數(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é)

以上是生活随笔為你收集整理的哈希算法的用途的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。