2011-11-22 65 views
6

標題基本上說這一切。我試過谷歌搜索,但返回一大堆誤報。我想我只是想知道這兩個具體數字背後是否存在某種基本原理,或者他們是否可以很容易地使用其他許多數字?爲什麼Eclipse生成的equals會有什麼特別的原因,爲布爾值使用1231和1237的值?

編輯:而且,由於數字的來源已被回答,所以布爾hashCode方法的作者使用這些數字(除了它們是素數)之外的任何原因?其他任何一組素數都可以工作嗎?

+4

他們都是質數,如果這是任何幫助。 –

+0

[Boolean.hashCode()](http://stackoverflow.com/questions/3912303/boolean-hashcode) – assylias

回答

4

哈希函數容易出現collisions。通過使用素數可以減少碰撞次數(考慮素數有的因素)。 1231和1237都是素數。

/E1
做了進一步的研究之後我碰到this

因爲他們很可能會與 哈希表大小沒有公約數(除黃金本身divises哈希表的大小),在常見散列表實現中碰撞的機會將最小化爲 。

+0

所以這兩個沒什麼特別的,只是它們是素數?那麼,11和17會一樣好? – AHungerArtist

+0

@AHungerArtist素數越大,功能就越安全。據我所知,這有其根源在密碼學中,大素數乘以一起產生更大(且相當安全)的密鑰。 – Jeffrey

+2

@AHungerArtist事實證明,在發生碰撞之前,哈希表越大,散列表必須越大。在這種情況下,哈希表將在發生衝突之前擁有2462(2 * 1231)個存儲桶。 爲什麼java的開發人員選擇*這些*素數是一個最好留給他們的問題。 – Jeffrey

6

這些數字來自官方Boolean API

+1

可能的重複仍然存在這些問題來自哪裏以及爲什麼。 – AHungerArtist

+4

同意,但這就是爲什麼Eclipse生成的平等使用它們的原因。 –

3

它們顯然是調用Java核心Boolean class hashCode() results的捷徑。

返回: 如果此對象表示爲真,則爲整數1231;如果此對象表示爲false,則返回整數1237。

可以找到更深入的討論(儘管只是以假設而不是硬性的事實結束)可以找到here

1

這仍然存在問題,這些問題來自哪裏以及爲什麼。

也許是他們是從某人的辦公室到工作人員自助餐廳的步數的最佳估計。或某人的女友朋友的電話號碼。誰知道。

底線是,除非你追蹤原始(Sun)作者並詢問他們,否則你永遠不會知道真實的答案。 (我假設他們還記得真正的答案,並準備告訴你!)

讓待着......

相關問題