java.lang.Object'使用的算法到底是什么;s哈希码
java.lang.Object'使用的算法到底是什么;s哈希码,java,openjdk,Java,Openjdk,JVM中用于实现java.lang.Object的隐式hashCode()方法的算法是什么 [OpenJDK或Oracle JDK在答案中是首选]。它依赖于实现(因此,算法完全取决于实现,只要它是一致的。)但是,根据答案,您可以看到在OpenJDK 7中生成哈希的位置(查看get\u next\u hash()函数),它实际上指定了此特定版本中的许多可能算法: // Possibilities: // * MD5Digest of {obj,stwRandom} // * CRC32 of {o
JVM
中用于实现java.lang.Object
的隐式hashCode()
方法的算法是什么
[
OpenJDK
或Oracle JDK
在答案中是首选]。它依赖于实现(因此,算法完全取决于实现,只要它是一致的。)但是,根据答案,您可以看到在OpenJDK 7中生成哈希的位置(查看get\u next\u hash()
函数),它实际上指定了此特定版本中的许多可能算法:
// Possibilities:
// * MD5Digest of {obj,stwRandom}
// * CRC32 of {obj,stwRandom} or any linear-feedback shift register function.
// * A DES- or AES-style SBox[] mechanism
// * One of the Phi-based schemes, such as:
// 2654435761 = 2^32 * Phi (golden ratio)
// HashCodeValue = ((uintptr_t(obj) >> 3) * 2654435761) ^ GVars.stwRandom ;
// * A variation of Marsaglia's shift-xor RNG scheme.
// * (obj ^ stwRandom) is appealing, but can result
// in undesirable regularity in the hashCode values of adjacent objects
// (objects allocated back-to-back, in particular). This could potentially
// result in hashtable collisions and reduced hashtable efficiency.
// There are simple ways to "diffuse" the middle address bits over the
// generated hashCode values
//
如前所述,默认算法只是使用一个随机数,但下面有一条有趣的评论指出:
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
// likely make this the default in future releases.
这类似于上述可能性列表中提到的
(obj^strandom)
方法,但它通过绑定“线程特定状态”绕过了与连续快速分配的对象相关的不需要的规则性散列中也包含信息——因此,如果两个对象碰巧在非常相似的时间分配,因为它们被分配到两个同时执行的独立线程上,那么输入散列中的离散线程信息应该仍然能够确保生成足够多的离散散列。只是好奇……既然Java是开源的,那么阻止您查看自己?@PM77-1可能是因为这是本机
方法,没有多少人知道在哪里查找它的实现。请参阅-其中有指向本机源代码的链接。但是,在阅读源代码后,我更困惑了。应该注意的是,其他对象的哈希代码算法到处都是。S我最后一次看到的tring使用字符串数据前N个字符的散列。容器对象将使用所包含对象的散列的某种总和。注意到了。我理解,但我仍然对对象特别好奇。