兩個方法,一個是得到結點的方法,一個是算法的方法
/**
* 得到應當路由到的結點
*/
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位的算法,是不懂。問了幾個數學的同學,讓我用代入法試試,我的疑惑不是這個結果,我試着理解理解吧,求指點。詳細資料放資料庫吧。