架构训练营第五周 - 作业

用户头像
无心水
关注
发布于: 2020 年 07 月 06 日
架构训练营第五周 - 作业



作业



  1. 用你熟悉的编程语言实现一致性hash算法

  2. 编写测试用例测试这个算法,测试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
用户头像

无心水

关注

路漫漫其修远兮 2018.08.16 加入

熟悉Java,略懂Python

评论

发布
暂无评论
架构训练营第五周 - 作业