两个方法,一个是得到结点的方法,一个是算法的方法
/**
* 得到应当路由到的结点
*/
public static String getServer(SortedMap<Integer, String> nodes, String key) {
// 得到带路由的结点的Hash值
int hash = SubTableHash.getHash(key);
// 得到大于该Hash值的所有Map
SortedMap<Integer, String> subMap =
nodes.tailMap(hash);
String virtualNode = "";
if (subMap.size() == 0) {
//超出最大值 取第一个
virtualNode = nodes.get(nodes.firstKey());
} else {
// 第一个Key就是顺时针过去离node最近的那个结点
Integer i = subMap.firstKey();
virtualNode = subMap.get(i);
}
// 返回对应的虚拟节点名称
return virtualNode;
}
public static int getHash(String str) {
final int p = 16777619;
int hash = (int)2166136261L;
for (int i = 0; i < str.length(); i++) {
hash = (hash ^ str.charAt(i)) * p;
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
// 如果算出来的值为负数则取其绝对值
if (hash < 0) {
hash = Math.abs(hash);
}
return hash % 128;
}
思路基本能懂,但是上面的算法叫HASHFNV优化后的32位的算法,是不懂。问了几个数学的同学,让我用代入法试试,我的疑惑不是这个结果,我试着理解理解吧,求指点。详细资料放资料库吧。