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得到,重点在于保存好虚拟节点与真实节点的关系,后面以此通过虚拟节点找到真实节点。