我正在寻找 Object.hashCode()的算法。
此代码在Object.java中是原生的。
这是因为
(a)代码在汇编中 - 从来没有在Java或任何其他HLL
或
(b)它没有被披露
?
在任何一种情况下,我都希望得到“如何计算 hashCode()”的算法(伪代码或一些详细解释) - 什么是它的参数计算和计算本身?
请注意:这是hashCode() of Object我正在寻找 - 不是像 String 或 hashMap / table 那样的。
// ============================================= =============================
new Java docs - jdk 8现在说
"The value returned by hashCode() is the object's hash code, which is the object's memory address in hexadecimal."
答案 0 :(得分:11)
原生hashCode
方法实现取决于JVM
。默认情况下,HotSpot会返回随机数,您可以在source code(函数get_next_hash
)
答案 1 :(得分:8)
尽管有Javadoc,算法只能使用地址作为输入。这意味着即使新对象在eden空间中使用相同的地址,它们也不会具有相同的hashCode。
它可能正在使用许多算法而不是全部使用该地址。
注意:hashCode()是31位。
BTW您可以在Hotspot上使用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
答案 2 :(得分:1)
hashCode
是本机方法,这意味着在内部调用系统库。这是因为hashcode内部将尝试根据对象内存位置生成数字。此代码与机器有关,可能用C语言编写。
但如果您真的有兴趣查看本机代码,请按照以下步骤操作:
http://hg.openjdk.java.net/jdk7/jdk7-gate/jdk/file/e947a98ea3c1/src/share/native/java/
答案 3 :(得分:0)
这是因为它依赖于未暴露给Java代码的低级细节。标准库的一些基本部分(如java.lang.Object
)必须在本机代码中实现。
顺便说一句,你可以找到至少一个interesting article,它可以更详细地了解HotSpot的实现。