package com.example.webdemo.framework.threadlocal;
/**
* 计算threadlocal扩容后下标索引
*
* @author safe
* @date 2021/3/6
*/
public class MagicHashCode {
//ThreadLocal中定义的hash魔数
private static final int HASH_INCREMENT = 0x61c88647;
public static void main(String[] args) {
hashCode(16);
hashCode(32);
hashCode(64);
hashCode(128);
}
/**
* 此算法在长度为2的N次方的数组上,确实可以完美散列
* @param len
*/
public static void hashCode(Integer len) {
int hashCode = 0;
for (int i = 0; i < len; i++) {
hashCode = i * HASH_INCREMENT + HASH_INCREMENT;// 每次递增HASH_INCREMENT
System.out.print(hashCode & (len - 1)); // index
System.out.print(" ");
}
System.out.println();
}
}
7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0
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
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
71 14 85 28 99 42 113 56 127 70 13 84 27 98 41 112 55 126 69 12 83 26 97 40 111 54 125 68 11 82 25 96 39 110 53 124 67 10 81 24 95 38 109 52 123 66 9 80 23 94 37 108 51 122 65 8 79 22 93 36 107 50 121 64 7 78 21 92 35 106 49 120 63 6 77 20 91 34 105 48 119 62 5 76 19 90 33 104 47 118 61 4 75 18 89 32 103 46 117 60 3 74 17 88 31 102 45 116 59 2 73 16 87 30 101 44 115 58 1 72 15 86 29 100 43 114 57 0
ThreadLocalMap中Entry[] table 的大小必须是2的N次方(len = 2^N),那 len-1的二进制表示就是低位连续的N个1,key.threadLocalHashCode & (len-1)的值就是threadLocalHashCode的低N位
本文探讨了如何利用ThreadLocal的hash值进行扩容后索引计算,重点介绍了在特定数组长度上的散列算法,展示了通过hashCode方法实现的实例计算结果。
10万+

被折叠的 条评论
为什么被折叠?



