14

Object.hashCode()のアルゴリズムを探しています。

このコードはObject.javaでネイティブです。

これだからか

(a) コードはアセンブリーにあります。Java やその他の HLL にはまったくありませんでした。

また

(b) 単に開示されていない

?

どちらの場合でも、「 hashCode()の計算方法」のアルゴリズム (疑似コードまたは詳細な説明) を取得しようとしています。その計算と計算自体に使用されるパラメーターは何ですか?

注意: これは、 私が探しているObjectのhashCode()です。 StringhashMap/tableのようなものではありません。

//================================================ ==========================

新しい Java ドキュメント-- jdk 8 が現在言っていること

"The value returned by hashCode() is the object's hash code, which is the object's memory address in hexadecimal." 
4

4 に答える 4

9

Javadoc にもかかわらず、アルゴはアドレスを入力としてしか使用できません。これは、新しいオブジェクトが eden 空間で同じアドレスを使用しても、同じ hashCode を持たないことを意味します。

使用している可能性のあるアルゴリズムは多数ありますが、すべてがアドレスを使用しているわけではありません。

注: hashCode() は 31 ビットです。

ところで、ホットスポットで設定できますUnsafe.putInt(object, 1, value)

Set<Integer> ints = new LinkedHashSet<>();
int negative = 0, nonneg = 0;
for (int i = 0; i < 100; i++) {
    System.gc();
    for (int j = 0; j < 100; j++) {
        int h = new Object().hashCode();
        ints.add(h);
        if (h < 0) negative++;
        else nonneg++;
    }
}
System.out.println("unique: " + ints.size() + " negative: " + negative + " non-neg: " + nonneg);

版画

unique: 10000 negative: 0 non-neg: 10000

安全でない使用

Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);

Object o = new Object();
System.out.println("From header " + Integer.toHexString(unsafe.getInt(o, 1L)));
// sets the hashCode lazily
System.out.println("o.hashCode()  " + Integer.toHexString(o.hashCode()));
// it's here now.
System.out.println("after hashCode() From header " + Integer.toHexString(unsafe.getInt(o, 1L)));
unsafe.putInt(o, 1L, 0x12345678);
System.out.println("after change o.hashCode()  " + Integer.toHexString(o.hashCode()));

版画

From header 0
o.hashCode()  2260e277
after hashCode() From header 2260e277
after change o.hashCode()  12345678
于 2013-07-31T18:02:09.050 に答える
0

これは、Java コードに公開されていない低レベルの詳細に依存しているためです。標準ライブラリの一部の基本部分 ( などjava.lang.Object) は、ネイティブ コードで実装する必要があります。

余談ですが、HotSpot の実装について詳しく説明している興味深い記事が少なくとも 1 つ見つかります。

于 2013-07-31T17:57:31.030 に答える