第 5 周作业
发布于: 2020 年 11 月 22 日
用你熟悉的编程语言实现一致性 hash 算法
预设5台服务器,每台服务器预设150个虚拟结点。
如下代码仅实现基础功能,仅实现初始化及获取服务器功能。
java自带的hash算法具有局限性,因此采用了FNV1_32_HASH算法。
package hash;import java.util.SortedMap;import java.util.TreeMap;public class ConsistentHash { private static String[] servers = { "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4", "192.168.0.5" }; private static SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>(); private static final int VIRTUAL_NODE_NUMBER = 150; private static final String VIRUTAL_NODE_SPIT_STRING = "#"; static { for (int i = 0; i < servers.length; i++) { String server = servers[i]; for (int j = 0; j < VIRTUAL_NODE_NUMBER; j++) { String virtualNode = server + VIRUTAL_NODE_SPIT_STRING + j; int hashCode = getHash(virtualNode); virtualNodes.put(hashCode, virtualNode);// server); } } } // FNV1_32_HASH private 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); hash = hash & Integer.MAX_VALUE; return hash; } public static String getServer(String key) { int hashCode = getHash(key); SortedMap<Integer, String> tailMap = virtualNodes.tailMap(hashCode); String virtualNode; if (!tailMap.isEmpty()) { virtualNode = tailMap.get(tailMap.firstKey()); } else { virtualNode = virtualNodes.get(virtualNodes.firstKey()); } if (virtualNode != null && !virtualNode.isEmpty()) { String server = virtualNode.substring(0, virtualNode.indexOf(VIRUTAL_NODE_SPIT_STRING)); return server; } return null; }}
划线
评论
复制
发布于: 2020 年 11 月 22 日阅读数: 22
Steven
关注
还未添加个人签名 2008.07.18 加入
还未添加个人简介
评论