1

getY()とgetX()の2つのメソッドを持つクラスがあります(これは一種のマップです)。
YとXの定義域は[-1000.0、+ 1000.0]であり、それらは2倍です。
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の場合にオーバーフローが発生することです。オーバーフローを処理し、すべての場合に2つの異なるオブジェクトに対して2つのハッシュコードを返すことができるhashCode()メソッドを作成するにはどうすればよいですか?

4

1 に答える 1

1

これはあなたがダブルスのためにそれをするべき方法です(ここを見てください):

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

prime小さめの素数を使用する場合、標準値は37です。

別の素数で初期化resultします。ゼロから開始しないでください。そのための標準は17です。

これは、JoshBlochによるEffectiveJavaからのものです。

あなたの当面の質問に関して:

オーバーフローを無視して処理します。ハッシュコードの計算ではオーバーフローを歓迎します。

もちろん、考えられるすべての値に対して個別のハッシュを保証することはできません。目標は、独自性ではなく、優れた分散です。

于 2012-04-29T21:47:10.810 に答える