架构师训练营第五周作业

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

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

这里使用基于虚拟节点的一致性Hash算法

import java.util.*;
/**
* 类说明:
*/
public class ConsistentHash {
private static final int DEFAULT_NOTES = 5;
private static String[] servers = {"196.168.0.1:111","192.168.0.2.:111","192.168.0.3:111","192.168.0.4:111"};
private static SortedMap<Integer, String> virtualNodes = new TreeMap<>();
private static List<String> realNodes = new LinkedList<>();
static{
for (int i = 0; i < servers.length; i++) {
realNodes.add(servers[i]);
}
for (String str : realNodes) {
int realHash = getHash(str);
int realInterval = Integer.MAX_VALUE / DEFAULT_NOTES;
for (int i = 0; i < DEFAULT_NOTES; i++) {
String virtualNodeName = str + "&&VN" + String.valueOf(i);
int hash = (realHash + realInterval * i) & Integer.MAX_VALUE;
System.out.println("[" + virtualNodeName + "]加入集合中,其Hash值为:" + hash);
virtualNodes.put(hash, virtualNodeName);
}
}
System.out.println();
}
private static String getServer(String key){
int hash = getHash(key);
SortedMap<Integer, String> tailMap = virtualNodes.tailMap(hash);
if (tailMap.isEmpty()) {
long serverKey = virtualNodes.firstKey();
return virtualNodes.get(serverKey);
} else {
long serverKey = tailMap.firstKey();
return virtualNodes.get(serverKey);
}
}
/**
* 使用FNV1_32_HASH算法计算服务器的Hash值,这里不使用重写hashCode的方法,最终效果没区别
* 从网上借鉴的
*/
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);
}
return hash;
}
}

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



用户头像

月殇

关注

还未添加个人签名 2019.04.15 加入

还未添加个人简介

评论

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