架构训练营第五周 - 作业
发布于: 2020 年 07 月 06 日
作业
用你熟悉的编程语言实现一致性hash算法
编写测试用例测试这个算法,测试100万KV数据,10个服务器节点的情况下,计算这些KV数据在服务器分布数量的标准差,以评估算法的存储负载不均衡性
Code
构建环
public class HashCircleFactory { public static Map<Integer, String> build(List<String> nodes, int virtual) { final Map<Integer, String> circleHashMap = new TreeMap<>(); Random random = new Random(Integer.MAX_VALUE); Map<String, Map<Object, Object>> nodeMap = new TreeMap<>(); nodes.forEach(key -> { nodeMap.put(key, new TreeMap<>()); //随机数字,尽可能均匀分布 int rd = Math.abs(random.nextInt()); int hashCode = Math.abs(key.hashCode()); int init = Math.abs(hashCode * rd % Integer.MAX_VALUE % virtual); for (int i = 0; i < virtual; i++) { circleHashMap.put(init + i, key); } }); System.out.println(circleHashMap); return circleHashMap; }}
测试
public class Test { private static final List<String> list = new ArrayList<>(); public static void main(String[] args) { List<String> ipAddressList = List.of("10.22.34.91", "10.22.34.92", "10.22.34.93", "10.22.34.94", "10.22.34.95", "10.22.34.96", "10.22.34.97", "10.22.34.98", "10.22.34.99", "10.22.34.10"); Map<Integer, String> circle = HashCircleFactory.build(ipAddressList, 32); list.stream().forEach(str -> { int hashCode = Math.abs(str.hashCode()); // System.out.println("str hashCode:" + hashCode); int mo=hashCode%ipAddressList.size(); // System.out.println("str hashCode mo:" + mo); Integer rightKey = circle.keySet().stream().filter(key -> mo <= key).findFirst().get(); String rightValue = circle.get(rightKey); System.out.println("str hashCode mo:" + mo+" rightKey:" + rightKey+" rightValue:" + rightValue); // System.out.println("rightValue:" + rightValue); }); } static { for (int i = 0; i < 1000; i++) { String str = RandomUtils.generateString(10); list.add(str); } }}
划线
评论
复制
发布于: 2020 年 07 月 06 日 阅读数: 50
版权声明: 本文为 InfoQ 作者【无心水】的原创文章。
原文链接:【http://xie.infoq.cn/article/e4ef0f4367fd196cea166004f】。文章转载请联系作者。
无心水
关注
路漫漫其修远兮 2018.08.16 加入
熟悉Java,略懂Python
评论