2012-03-10 10 views
9

私はJavaでdoubleをハッシュする方法を知りましたか?私は他の原始的なデータとオブジェクトをハッシュしました。私はhashcodeメソッドを使うことができると思った?私が見たことから、これはかなり複雑に見えます。私は種を作ることについて何かを見つけた。Javaでハッシュを二重に

私はこれについてどうやって行くのか考えていました。二重のクラスのために私のハッシュコードの残りの部分を入れたいと思っていますか?

Javaでarraylists、配列、およびその他のオブジェクトをハッシュしようとしている私に問題があるのだろうかと思っていました。私のクラスにはarraylistsが含まれています。

多くのおかげ

答えて

20

Double.hashCode()複雑な?これは基本的にdoublelongに変換します(これらはどちらもメモリ内の単純に64ビットの値です)。longハッシュは非常に簡単です。 double - >long変換はpublic static doubleToLongBits()で行われます。これについては何が複雑ですか?

例:あなたがこれを必要とする内容に応じて

Double.valueOf(42.5).hashCode();  //better answer to everything 

Long.valueOf(Double.doubleToLongBits(42.5)).hashCode(); 
+0

こんにちはトマシュを働いていた、私は二重にハッシュコードを試してみましたが、次のメッセージが間接参照することはできませんです。私はgetClassMethod()すなわちthis.getClassMethod()。hashCode();でhashcode()メソッドを実行しています。 getClassMethodはdoubleを返します。 – daveb

+0

@daveb:私はちょうど私の答えに追加した例を見てください。 –

+0

ありがとう@Thomasz、私はintをしましたhash6 = Double.valueOf(this.getClassMethod())。hashCode();それは以前の問題なしでコンパイルされました。あなたのコードの行は大丈夫ですか?乾杯DaveB – daveb

2

、あなただけのMOD(INGの)の非常に単純なアプローチで行くことができること。

int hash(double d) { 
    return d % 71; //use a prime number here 
} 

それだけでハッシュのいくつかのダブルスを格納するためのものであるならば、これはそれを行う必要があります。 ハッシュを広げたい場合は、「71」を増やしてください。

+0

これは貧弱なハッシュです。お互いに近い倍に同じ値を返します。あなたのプログラムが0と1の間の倍精度を必要とする場合はどうしますか?定数ハッシュ。 –

+0

私はdiffクラスのすべてのフィールドをハッシュし、hashcode、equals、およびすべてのクラスの文字列をオーバーライドしています。私はそれらのオブジェクトを比較することができますし、オブジェクトもユニークであることを確認することができます。私は31の素数を使用し、ハッシュコードを1に連結しています。私の倍数はアイテムの価格です。 DaveB – daveb

+1

@TomaszNurkiewiczは完全に同意します!だからこそ私は「あなたが必要とするものに応じて」始めました。あなたの値がすべて0と1の間にあることを「知っている」場合は、何か他のものを使うべきです。 – krico

2

Javaのやり方は、ダブルの生のビットをlongに変換することです。

// from Double. 
public static long doubleToLongBits(double value) { 
    long result = doubleToRawLongBits(value); 
    // Check for NaN based on values of bit fields, maximum 
    // exponent and nonzero significand. 
    if (((result & DoubleConsts.EXP_BIT_MASK) == 
      DoubleConsts.EXP_BIT_MASK) && 
     (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L) 
     result = 0x7ff8000000000000L; 
    return result; 
} 

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

注:NaN(および2つのタイプ)の値は多くありますが、Javaではそれらがすべて同じものとして扱われます。

1

この1つは私のため

int h2 = new Double(area).hashCode();