一、哈希樹(shù)hashtree常應(yīng)用現(xiàn)實(shí)場(chǎng)景
1、場(chǎng)景一:安全加密
日常用戶密碼加密通常使用的都是 md5、sha等哈希函數(shù),因?yàn)椴豢赡?,而且微小的區(qū)別加密之后的結(jié)果差距很大,所以安全性更好。
2、場(chǎng)景二:少數(shù)標(biāo)識(shí)
比如 URL 字段或者圖片字段要求不能重復(fù),這個(gè)時(shí)候就可以通過(guò)對(duì)相應(yīng)字段值做 md5 處理,將數(shù)據(jù)統(tǒng)一為 32 位長(zhǎng)度從數(shù)據(jù)庫(kù)索引構(gòu)建和查詢角度效果更好,此外,還可以對(duì)文件之類的二進(jìn)制數(shù)據(jù)做 md5 處理,作為少數(shù)標(biāo)識(shí),這樣判定重復(fù)文件的時(shí)候更快捷。
3、場(chǎng)景三:數(shù)據(jù)校驗(yàn)
比如從網(wǎng)上下載的很多文件(尤其是P2P站點(diǎn)資源),都會(huì)包含一個(gè) MD5 值,用于校驗(yàn)下載數(shù)據(jù)的完整性,避免數(shù)據(jù)在中途被劫持篡改。
4、場(chǎng)景五:散列函數(shù)
前面已經(jīng)提到,PHP 中的 md5、sha1、hash 等函數(shù)都是基于哈希算法計(jì)算散列值
5、場(chǎng)景五:負(fù)載均衡
對(duì)于同一個(gè)客戶端上的請(qǐng)求,尤其是已登錄用戶的請(qǐng)求,需要將其會(huì)話請(qǐng)求都路由到同一臺(tái)機(jī)器,以保證數(shù)據(jù)的一致性,這可以借助哈希算法來(lái)實(shí)現(xiàn),通過(guò)用戶 ID 尾號(hào)對(duì)總機(jī)器數(shù)取模(取多少位可以根據(jù)機(jī)器數(shù)定),將結(jié)果值作為機(jī)器編號(hào)。
6、場(chǎng)景六:分布式緩存
分布式緩存和其他機(jī)器或數(shù)據(jù)庫(kù)的分布式不一樣,因?yàn)槊颗_(tái)機(jī)器存放的緩存數(shù)據(jù)不一致,每當(dāng)緩存機(jī)器擴(kuò)容時(shí),需要對(duì)緩存存放機(jī)器進(jìn)行重新索引(或者部分重新索引),這里應(yīng)用到的也是哈希算法的思想。
延伸閱讀:
二、哈希算法的一般特性
從哈希值不能反向推導(dǎo)出原始數(shù)據(jù)(所以哈希算法也叫單向算法,不可逆);對(duì)輸入數(shù)據(jù)非常敏感,哪怕原始數(shù)據(jù)只修改了一個(gè)比特,最后得到的哈希值也大不相同;散列沖突的概率要很小,對(duì)于不同的原始數(shù)據(jù),哈希值相同的概率非常小;哈希算法的執(zhí)行效率要盡量高效,針對(duì)較長(zhǎng)的文本,也能快速地計(jì)算出哈希值。