首页 > 其他 > 详细

不同对象identityHashCode一定不同吗

时间:2020-09-12 16:57:06      阅读:94      评论:0      收藏:0      [点我收藏+]

转自

https://www.jianshu.com/p/24fa4bdb9b9d

https://zhuanlan.zhihu.com/p/28270828

https://hllvm-group.iteye.com/group/topic/39183

https://www.jianshu.com/p/be943b4958f4

 

总结:

1. 有6种方法生成hashcode,jdk8后默认第5种--xor-shift随机数生成

0 - 使用Park-Miller伪随机数生成器(跟地址无关)
1 - 使用地址与一个随机数做异或(地址是输入因素的一部分)
2 - 总是返回常量1作为所有对象的identity hash code(跟地址无关)
3 - 使用全局的递增数列(跟地址无关)
4 - 使用对象地址的“当前”地址来作为它的identity hash code(就是当前地址)
5 - 使用线程局部状态来实现Marsaglia‘s xor-shift随机数生成(跟地址无关,默认)
 
2. 由于是随机数,所以可能相同
 (1)一个对象在其生命期中 identity hash code 必定保持不变 (Java对象会在首次真正使用到它的identity hash code时调用VM里的函数来计算出值,然后保存在对象头部的markword);
(2)如果a == b,那么他们的System.identityHashCode() 必须相等
    如果他们的System.identityHashCode() 不相等,那他们必定不是同一个对象(逆否命题与原命题真实性总是相同);
(3)如果System.identityHashCode() 相等的话,并不能保证 a == b
 
3. Xorshift 随机数生成器
 
Xorshift 随机数生成器是 George Marsaglia 发明的一类伪随机数生成器。它们通过和自己逻辑移位后的数进行异或操作来生成序列中的下一个数。这在现代计算机体系结构非常快。它们是线性反馈移位寄存器的一个子类,其简单的实现使它们速度更快且使用更少的空间。然而,必须仔细选择合适参数以达到长周期。

Xorshift生成器是非密码安全的随机数生成器中最快的一种,只需要非常短的代码和状态。虽然它们没有进一步改进以通过统计检验,这个缺点非常著名且容易修改(Marsaglia 在原来的论文中指出),用复合一个非线性函数的方式,可以得到比如像 xorshift+ 或 xorshift* 生成器。一个简单的C语言实现的 xorshift+ 生成器通过了所有的 BigCrush 的测试(比 Mersenne Twister 算法和 WELL 算法的失败次数减少了一个数量级),而且在 x86 上产生一个随机数通常只需要不到十个时钟周期,多亏了指令流水线。

不同对象identityHashCode一定不同吗

原文:https://www.cnblogs.com/GY8023/p/13657359.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!