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位