Object.hashCode() algorithm

前端 未结 4 1165
醉梦人生
醉梦人生 2020-12-17 15:45

I\'m looking for the algorithm of Object.hashCode().

This code is native in Object.java.

Is this because

(a) the code is in assemb

4条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-17 16:27

    Despite the Javadoc, the algo only may use the address as an input. This means that even though new objects use the same address in eden space they won't have the same hashCode.

    There is a number of algos it might be using and not all use the address.

    Note: the hashCode() is 31-bit.

    BTW You can set it with Unsafe.putInt(object, 1, value)on Hotspot.

    Set 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);
    

    prints

    unique: 10000 negative: 0 non-neg: 10000
    

    Using Unsafe

    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()));
    

    prints

    From header 0
    o.hashCode()  2260e277
    after hashCode() From header 2260e277
    after change o.hashCode()  12345678
    

提交回复
热议问题