week05 作业
发布于: 2020 年 10 月 25 日
作业1
代码实现一致性哈希Hash算法
如何实现
首先建立一个2的32次方环,0~2的32次方-1,首尾相连,构建一个一致性哈希环;
把服务器若干个虚拟节点的哈希值,放到这个环上;
要计算的哈希值的Key值,也放到环上;
从这个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); }}
划线
评论
复制
发布于: 2020 年 10 月 25 日 阅读数: 11
追风
关注
还未添加个人签名 2018.01.08 加入
还未添加个人简介
评论