threadlocal 数组索引下标计算

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位

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值