- hashcode相等值不一定相等,值相等hashcode一定相等
- String的hashcode方法重写了
public static int hashCode(byte[] value) {
int h = 0;
for (byte v : value) {
h = 31 * h + (v & 0xff);
}
return h;
}
- 由于哈希码(HashCode)的目的是为了区分对象,所以其分布自然是越均匀越好。为了保证分布均匀,一般的方法是使用一些相对大的素质,但是为什么选择了31,而不是 23、29、37 或者直接更大的,如97?
- hashcode的6种生成策略 https://zhuanlan.zhihu.com/p/348612455
可以通过在JVM启动参数中添加-XX:hashCode=4,改变默认的hashCode计算方式。
hashCode=0
if (hashCode == 0) {
value = os::random() ;
}
此类方案返回一个Park-Miller伪随机数生成器生成的随机数OpenJdk 6 &7的默认实现。
- hashCode=1
if (hashCode == 1) {
intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ;
value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
}
此类方案将对象的内存地址,做移位运算后与一个随机数进行异或得到结果。
- hashCode = 2
if (hashCode == 2) {
value = 1 ; // for sensitivity testing
}
此类方案返回固定的1。
- hashCode = 3
if (hashCode == 3) {
value = ++GVars.hcSequence ;
}
此类方案返回一个自增序列的当前值。
- hashCode = 4
if (hashCode == 4) {
value = cast_from_oop<intptr_t>(obj) ;
}
此类方案返回当前对象的内存地址。
- hashCode 为 其它
通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia's xorshift scheme随机数算法得到的一个随机数。JDK8 的默认hashCode的计算方法就是这个xorshift 算法。