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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么Java的字符串中的hashCode()使用31作為乘數(shù)?

為什么Java的字符串中的hashCode()使用31作為乘數(shù)?

犯罪嫌疑人X 2019-06-18 10:23:30
為什么Java的字符串中的hashCode()使用31作為乘數(shù)?根據(jù)Java文檔,散列碼為了String對(duì)象計(jì)算為:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]使用int算術(shù),哪里s[i]是i字符串的第四個(gè)字符,n字符串的長(zhǎng)度,以及^指示指數(shù)。為什么31被用作乘數(shù)?我知道乘數(shù)應(yīng)該是一個(gè)相對(duì)較大的素?cái)?shù)。那么為什么不是29,37,甚至97呢?
查看完整描述

4 回答

?
慕標(biāo)琳琳

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊

根據(jù)約書亞·布洛赫的有效Java(這是一本不能推薦的書,我之所以買這本書,是因?yàn)槲也粩嗟靥岬蕉询B溢出):

之所以選擇31值,是因?yàn)樗且粋€(gè)奇數(shù)素?cái)?shù)。如果是偶數(shù),乘法溢出,信息就會(huì)丟失,因?yàn)槌?等于移動(dòng)。使用質(zhì)數(shù)的優(yōu)點(diǎn)不太清楚,但它是傳統(tǒng)的。31的一個(gè)優(yōu)點(diǎn)是可以用移位和減法來代替乘法,以獲得更好的性能:31 * i == (i << 5) - i..現(xiàn)代VM自動(dòng)進(jìn)行這種優(yōu)化。

(從第3章第9項(xiàng):當(dāng)您重寫等于時(shí)始終重寫hashcode,第48頁)


查看完整回答
1 反對(duì) 回復(fù) 2019-06-18
?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

Goodrich和Tamassia指出,如果您取超過50,000個(gè)英文單詞(由Unix的兩個(gè)變體中提供的單詞列表組成),使用常數(shù)31、33、37、39和41在每種情況下產(chǎn)生的碰撞將少于7次。知道了這一點(diǎn),許多Java實(shí)現(xiàn)選擇這些常量之一就不足為奇了。

巧合的是,當(dāng)我看到這個(gè)問題時(shí),我正在閱讀“多項(xiàng)式哈希碼”一節(jié)。

編輯:這是鏈接到~10 mb PDF的書,我指的是上面。見第10.2節(jié)散列表(第413頁)Java中的數(shù)據(jù)結(jié)構(gòu)和算法


查看完整回答
反對(duì) 回復(fù) 2019-06-18
?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

在(大部分)舊處理器上,乘以31可能比較便宜。例如,在手臂上,它只是一條指令:

RSB       r1, r0, r0, ASL #5    ; r1 := - r0 + (r0<<5)

大多數(shù)其他處理器都需要一個(gè)單獨(dú)的移位和減法指令。然而,如果你的乘數(shù)比較慢,這仍然是一場(chǎng)勝利?,F(xiàn)代處理器往往有快速乘法器,所以它不會(huì)有太大的區(qū)別,只要32正確的一面。

它不是一個(gè)很好的哈希算法,但它足夠好,也比1.0代碼好(而且比1.0規(guī)范好得多!)


查看完整回答
反對(duì) 回復(fù) 2019-06-18
  • 4 回答
  • 0 關(guān)注
  • 999 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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