第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哈希函數(shù)取余法除數(shù)為何要取質(zhì)數(shù)?

哈希函數(shù)取余法除數(shù)為何要取質(zhì)數(shù)?

ibeautiful 2019-03-29 22:11:20
在我上一個帖子中沙渺的回答讓我覺得有點道理,又覺得毫無道理,直到我看到了這樣的帖子:HashTable(哈希表)就是根據(jù)對象的特征進(jìn)行定位的一種數(shù)據(jù)結(jié)構(gòu)。一個簡單的實現(xiàn)方法是將對象通過某種運算得到一個整數(shù),再讓這個整數(shù)除以哈希表的大小,取其余數(shù),以此作為對象的存儲位置。很多的書上認(rèn)為,哈希表的大小最好是選擇一個大的質(zhì)數(shù),并且最好不要和2的整數(shù)冪接近?!端惴▽?dǎo)論》上還認(rèn)為,最不好的選擇是哈希表的大小恰好是2的整數(shù)冪,對此的解釋是(只記得大意):因為計算機(jī)是用二進(jìn)制存儲的,當(dāng)一個二進(jìn)制數(shù)除以一個2的整數(shù)冪的時候,結(jié)果就是這個二進(jìn)制數(shù)的后幾位,前面的位都丟失了,也就意味著丟失了一部分信息,進(jìn)而導(dǎo)致哈希表中的元素分布不均勻。這個解釋看似合理,但我不認(rèn)同。不光是我,Java開發(fā)小組的人也不認(rèn)同。Java里的HashSet類偏偏就把哈希表的大小設(shè)置成2的整數(shù)冪??梢栽O(shè)想一下,對于自然數(shù)集合中的任意一個數(shù)x,對于一個正整數(shù)M,難道xmodM為某些值的概率會大些嗎?顯然不是,因為x是在自然數(shù)集合里任選的,當(dāng)選取的次數(shù)非常多時,xmodM的結(jié)果應(yīng)該是平均分布在[0,M-1]中。我認(rèn)為《算法導(dǎo)論》的錯誤在于先引入了二進(jìn)制,其實二進(jìn)制和哈希表的“碰撞”根本沒有什么關(guān)系;然后說對除以2^n的余數(shù)會丟失位,丟失信息,這顯然也不對,因為只要x>=M,xmodM的結(jié)果總是要“丟失一些信息的”。照《算法導(dǎo)論》的說法,如果計算機(jī)采用十進(jìn)制,那哈希表的容量是10^n的話豈不是很糟?這種解釋顯然站不住腳。我認(rèn)為對于xmodM這樣的哈希函數(shù)來說,好壞應(yīng)該取決于x的生成方式和M的值。比如一個字符串“ABC”,如果我讓x("ABC")=65128^2+66128+67,即把字符串當(dāng)成一個128進(jìn)制的整數(shù),那么若M=128,那就很糟糕了。因為這樣無論是什么字符串,最終結(jié)果只取決于最后一個字符,這才會造成分布不均勻。
查看完整描述

2 回答

?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗 獲得超4個贊

我上一個問題中弄錯的一個地方是討論了哈希結(jié)果暴露原值,而不是避免沖撞這個角度。
恰好等于或接近2^i的風(fēng)險我認(rèn)為都只是暴露原值。能輕易操縱哈希目標(biāo)值的特征,在安全性上是一個巨大的風(fēng)險——這樣就留下了用戶使用特意構(gòu)造的輸入,去試圖占用其他哈希值桶的攻擊方法。
而質(zhì)數(shù)才是用來避免沖撞。如果種子用合數(shù),那么很可能對合數(shù)的某個因數(shù)取余,所得到的余數(shù)仍然是一樣的。這樣就增加了同一個桶中元素的共同特征,危害了平攤的效果。
舉個例子:對4取余如果余1,那么對2取余仍然余1,那么1號桶就必然全部是奇數(shù)。同理0號桶必然是偶數(shù)。
從這一點來看,質(zhì)數(shù)與接近2^i與否其實完全是兩個無關(guān)的問題。
我必須說明的是:引文第3段的說法是一個極其想當(dāng)然的糟糕解釋。
理由很簡單:Java開發(fā)小組會蠢到用簡單取余算法去做HashSet么?原文作者分明就是把別人的完整實現(xiàn)蓄意偷來一部分,用來給自己偏執(zhí)的觀點貼金。
最后仍然必須再次聲明的是:單純?nèi)∮嗟墓_\算很糟糕。“遠(yuǎn)離2^i的質(zhì)數(shù)”、“接近2^i的質(zhì)數(shù)”、“恰好等于2^i”都只不過是“沒有那么差”、“確實很差”和“差到不能再差”的區(qū)別。
要么為沖撞做好準(zhǔn)備,給每一個桶都構(gòu)造一個鏈表,要么就任何時候都使用SHA-1等成熟且沖撞概率穩(wěn)定而足夠低的Hash算法。
                            
查看完整回答
1 反對 回復(fù) 2019-03-29
  • 2 回答
  • 0 關(guān)注
  • 1048 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號