ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习
背景为什么选择此魔数?过程源代码例子演示及其结果长度为16: 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0长度为32: 7 14 21 28 3 10 17 24 31 6 13 20 27 2 9 16 23 30 5 12 19 26 1 8 15 22 29 4 11 18 25 0长度为64: 7 14 21 28 35 42 4...
背景
- 为什么选择此魔数?
过程
-
源代码
-
例子演示及其结果
长度为16: 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0长度为32: 7 14 21 28 3 10 17 24 31 6 13 20 27 2 9 16 23 30 5 12 19 26 1 8 15 22 29 4 11 18 25 0
长度为64: 7 14 21 28 35 42 49 56 63 6 13 20 27 34 41 48 55 62 5 12 19 26 33 40 47 54 61 4 11 18 25 32 39 46 53 60 3 10 17 24 31 38 45 52 59 2 9 16 23 30 37 44 51 58 1 8 15 22 29 36 43 50 57 0
结论: 长度是2的N次方的,散列出来,没有重复的。
-
修改长度
结果:
结论: 散列出来有很多重复的。 -
魔数的来源
结果
这个魔数恰好与长度为2的N次方的数,散列出来的结果不会重复。设计者会为什么会考虑这样的实现呢?也就是他为什么能够想到这样的实现?还是说他的数学功底很扎实,知道这样散列是完美的?
小结
- hashCode = i * HASH_INCREMENT + HASH_INCREMENT,每次新增ThreadLocal实例到Entry[],自增0x61c88647。
- 元素散列位置(数组下标)= hashCode & (length-1)
- 长度是源代码给定的,用户不能设置。默认是16,每次扩容是原来的2倍。必须满足这样的扩容,才能满足散列出来的结果,没有重复的。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)