美文网首页
hashCode 生成策略

hashCode 生成策略

作者: 小郭子 | 来源:发表于2022-01-24 17:12 被阅读0次

hashCode的生成策略是通过全局变量控制的,默认为5,
也可以通过jvm启动参数来进行控制:-XX:hashCode=N

第一种算法:

if (hashCode == 0) {
     // This form uses an unguarded global Park-Miller RNG,
     // so it's possible for two threads to race and generate the same RNG.
     // On MP system we'll have lots of RW access to a global, so the
     // mechanism induces lots of coherency traffic.
     value = os::random();
  }

这种生成算法,使用的一种Park-Miller RNG的随机数生成策略。不过需要注意的是……这个随机算法在高并发的时候会出现自旋等待

第二种算法:

if (hashCode == 1) {
    // This variation has the property of being stable (idempotent)
    // between STW operations.  This can be useful in some of the 1-0
    // synchronization schemes.
    intptr_t addrBits = intptr_t(obj) >> 3 ;
    value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
}

这个算法,真的是对象的内存地址了,直接获取对象的 intptr_t 类型指针

第三种算法:

if (hashCode == 2) {
    value = 1 ;            // for sensitivity testing
}

固定返回 1,应该是用于内部的测试场景

第四种算法:

if (hashCode == 3) {
    value = ++GVars.hcSequence ;
}

自增嘛,所有对象的 hashCode 都使用这一个自增变量

第五种算法:

if (hashCode == 4) {
    value = intptr_t(obj) ;
}

这里和第 2 种算法其实区别不大,都是返回对象地址,只是第 2 种算法是一个变体。

第六种算法:

unsigned t = Self->_hashStateX ;
t ^= (t << 11) ;
Self->_hashStateX = Self->_hashStateY ;
Self->_hashStateY = Self->_hashStateZ ;
Self->_hashStateZ = Self->_hashStateW ;
unsigned v = Self->_hashStateW ;
v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;
Self->_hashStateW = v ;
value = v ;

当前状态值进行异或(XOR)运算得到的一个 hash 值,相比前面的自增算法和随机算法来说效率更高,但重复率应该也会相对增高,不过 hashCode 重复又有什么关系呢……
本来 jvm 就不保证这个值一定不重复,像 HashMap 里的链地址法就是解决 hash 冲突用的.

相关文章

  • hashCode 生成策略

    hashCode的生成策略是通过全局变量控制的,默认为5,也可以通过jvm启动参数来进行控制:-XX:hashCo...

  • Java 基础之 Equals与HashCode

    HashCode介绍 HashCode是object类的一个方法,用来生成该对象的hashCode值,主要为了提高...

  • Lombok EqualsAndHashCode 的用法

    @EqualsAndHashCode 此注解会生成equals(Object other) 和 hashCode(...

  • Java基础->HashMap之hashCode

    (1)首先明确一点,hashCode函数返回类型是int类型,也就是32位;(2)生成hashCode原则,尽量让...

  • Kotlin 笔记 数据类

    以下方法会自动生成 equals hashCode() toString() componentN 函数(用在解构...

  • 简化java代码利器 -- Lombok

    1.优点 自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高...

  • @EqualsAndHashCode

    @EqualsAndHashCode 平等变得简单:从对象的字段生成hashCode和equals实现。 Over...

  • SpringBoot lombok——@EqualsAndHas

    此注解会生成equals(Object other) 和 hashCode()方法。 它默认使用非静态,非瞬态的属...

  • 主键过长的危害

    create at 20210921modify at 这个问题的来源是主键生成策略,当你回答主键生成策略有:uu...

  • 10.数据类

    1.对应java中的javabean,主动生成hashcode,toString,copy等方法2.主构造器里面有...

网友评论

      本文标题:hashCode 生成策略

      本文链接:https://www.haomeiwen.com/subject/xywbhrtx.html