笔记:一致性hash

1、利用hash函数对2的32次方取模(hash(x) % 2^32)得到0到2^32-1之间的一个整数,后面数据查找节点时,顺时针取hash环上最近的节点。

2、为什么是2的32次方?

因为,java中int的最大值是2^31-1最小值是-2^31,2^32刚好是无符号整形的最大值;

而且又因为int的最大值最小值范围设定是因为一个int占4个字节,一个字节占8位,二进制中刚好是32位。(ip地址分为4段,每段8位,刚好占用32位)

扩展:dubbo源码中hash()也是切分4段的原理来做的(第一段<<24,第二段<<16。。。)

private long hash(byte[] digest, int number) {
            return (((long) (digest[3 + number * 4] & 0xFF) << 24)
                    | ((long) (digest[2 + number * 4] & 0xFF) << 16)
                    | ((long) (digest[1 + number * 4] & 0xFF) << 8) 
                    | (digest[0 + number * 4] & 0xFF)) 
                    & 0xFFFFFFFFL;
        }

   

3、hash环数据倾斜问题:在于设置虚拟节点,虚拟节点是真实节点多次hash得到,重点在于保存好虚拟节点与真实节点的关系,后面以此通过虚拟节点找到真实节点。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值