ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天

背景

  1. 为什么选择此魔数?

过程

  • 源代码

在这里插入图片描述

  • 例子演示及其结果 在这里插入图片描述 长度为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次方的数,散列出来的结果不会重复。

设计者会为什么会考虑这样的实现呢?也就是他为什么能够想到这样的实现?还是说他的数学功底很扎实,知道这样散列是完美的?

小结

  1. hashCode = i * HASH_INCREMENT + HASH_INCREMENT,每次新增ThreadLocal实例到Entry[],自增0x61c88647。

  2. 元素散列位置(数组下标)= hashCode & (length-1)

  3. 长度是源代码给定的,用户不能设置。默认是16,每次扩容是原来的2倍。必须满足这样的扩容,才能满足散列出来的结果,没有重复的。

猜你喜欢

转载自juejin.im/post/7082353762462859277
今日推荐