JavaSE回顾02
3/27/2021 java
# Hash家族
# hashcode()函数
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是根据对象存储地址返回一个int整数,哈希码的作用是确定该对象在哈希表中的索引位置
java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数
static inline intptr_t get_next_hash(Thread * Self, oop obj) { intptr_t value = 0 ; if (hashCode == 0) { // 根据Park-Miller伪随机数生成器生成的随机数 value = os::random() ; } else if (hashCode == 1) { // 此类方案将对象的内存地址,做移位运算后与一个随机数进行异或得到结果 intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ; value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ; } else if (hashCode == 2) { value = 1 ; // 返回固定的1 } else if (hashCode == 3) { value = ++GVars.hcSequence ; // 返回一个自增序列的当前值 } else if (hashCode == 4) { value = cast_from_oop<intptr_t>(obj) ; // 对象地址 } else { // 通过和当前线程有关的一个随机数+三个确定值 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 ; } value &= markOopDesc::hash_mask; if (value == 0) value = 0xBAD ; assert (value != markOopDesc::no_hash, "invariant") ; TEVENT (hashCode: GENERATE) ; return value; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36