2012-04-29 57 views
1

我有一個類有兩個方法:getY()和getX()(它是一種映射)。 Y和X的域名是[-1000.0,+ 1000.0],他們是雙打的。
我寫一個hashCode()方法:如何處理hashCode方法實現中的溢出

@Override 
public int hashCode() 
{ 
    int hash=(int) (getX()/EPSILON); 
    hash+= (int) ((1000.0/EPSILON)*getY()); 
    return hash; 
} 

哪裏EPSILON是容許的最大錯誤。
但問題是值太高,如果X = 1000.0和Y = 1000.0,我會發生溢出。 如何編寫處理溢出的hashCode()方法,並且仍然能夠在每種情況下爲兩個不同的對象返回兩個哈希碼?

+0

你最終會按照「Map」的大小去修改mod,這樣你就不會得到IndexOutOfBoundsException了嗎?如果是這樣的話,你可以在代碼的某個地方做一個mod來防止溢出。 – twain249

+0

你爲什麼將1000除以epsilon(我認爲這個數字非常小)? – Luciano

+0

要區分具有相同整數座標但不相同的雙座標的對象,則:(0.0,0.0)與(0.0 + EPSILON,0.0)不同。 –

回答

1

這是你應該怎麼雙打做到這一點(見here):

long t = Double.doubleToLongBits(d); 
result = prime * result + (int) (t^(t >>> 32)); 

prime使用一個很小的質數,標準值是37

初始化result與其他黃金,唐從零開始。標準是17.

這是來自Josh Bloch的Effective Java。

至於你的直接問題:

你忽視它處理溢出。在散列碼計算中歡迎溢出。

當然,您不能保證每個可能的值都有不同的散列值。目標是良好的分散性,而不是唯一性。