week05 作业

用户头像
追风
关注
发布于: 2020 年 10 月 25 日

作业1

代码实现一致性哈希Hash算法



如何实现



  1. 首先建立一个2的32次方环,0~2的32次方-1,首尾相连,构建一个一致性哈希环;

  2. 把服务器若干个虚拟节点的哈希值,放到这个环上;

  3. 要计算的哈希值的Key值,也放到环上;

  4. 从这个Key值,顺时针查找,离它最近的虚拟节点的服务器。



public class Node {
String ip;
public Node(String ip){
this.ip = ip;
}
}
public class ConsistentHashElegent {
private SortedMap<Integer,Node> hashCircle = new TreeMap<>();
public ConsistentHashElegent(Node[] nodes, int virualNums){
for (Node node : nodes){
for (int i = 0;i<virualNums;i++){
hashCircle.put(this.getHash(node.toString() + i),node);
}
}
}
public Node getConsistentNode(String key) {
int hash = getHash(key);
//得到大于该Hash值的所有Map
SortedMap<Integer, Node> tailMap = hashCircle.tailMap(hash);
hash = tailMap.isEmpty()? hashCircle.firstKey() : tailMap.firstKey();
return hashCircle.get(hash);
}
//使用FNV1_32_HASH算法计算服务器的Hash值
private int getHash(String str){
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;
return hash;
}
public static void main(String[] args){
Node[] nodes = {new Node("192.168.1.1"),new Node("192.168.1.2"),new Node("192.168.1.3")};
ConsistentHashElegent consistentHashElegent = new ConsistentHashElegent(nodes,5);
Node consistentNode = consistentHashElegent.getConsistentNode("123");
System.out.println(consistentNode);
}
}



用户头像

追风

关注

还未添加个人签名 2018.01.08 加入

还未添加个人简介

评论

发布
暂无评论
week05作业