2012-04-29 17 views
1

私はgetY()とgetX()という2つのメソッドを持つクラスを持っています。
YとXのドメインは[-1000.0、+ 1000.0]で、2倍です。私はハッシュコード()メソッドを書かれている
:EPSILONが許容最大誤差があるhashCodeメソッドの実装でオーバーフローを処理する方法

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


しかし、問題は、値が高すぎると、X = 1000.0とY = 1000.0の場合にオーバーフローが発生することです。 オーバーフローを処理し、いずれの場合も2つの異なるオブジェクトに対して2つのハッシュコードを返すことができるhashCode()メソッドの記述方法?

+0

あなたは最終的には 'Map'のサイズでmodに行き、' IndexOutOfBoundsException'を取得しないのですか?もしそうなら、オーバーフローを防ぐためにコードのどこかでmodを実行することができます。 – twain249

+0

なぜ1000をイプシロンで分けているのですか(これは本当に小さな数字です)? – Luciano

+0

同一の整数座標を持ち、同じ二重座標を持たないオブジェクトを区別するために.i:(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からのものです。

限り、あなたの即時の質問は:

あなたはそれを無視することによってオーバーフローを扱います。オーバーフローはハッシュコード計算では歓迎です。

もちろん、可能な値ごとに異なるハッシュを保証することはできません。目標は、分散性であり、一意性ではありません。

関連する問題