架构师训练营第五周作业
发布于: 2020 年 10 月 25 日
题目
用你熟悉的编程语言实现一致性 hash 算法。
用视频推荐的 150 虚拟节点/每服务器来实现该算法的均衡性。把服务器虚拟节点分配到环上,根据搜索的 key 的 hash 值来找到虚拟节点进而找到真实服务器。
package com.arch.week5;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHashing {
private static final int VIRTUAL_NODES = 150;
private List<String> serverList = null;
private SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>();
public ConsistentHashing(){
}
public ConsistentHashing(List serverList) {
this.serverList = serverList;
}
public void addServer(String serverName) {
this.serverList.add(serverName);
}
public void buildNodes() {
for (String str : serverList) {
for(int i = 0; i < VIRTUAL_NODES; i++){
String virtualNodeName = str + "-VNode-" + String.valueOf(i);
int hash = getHash(virtualNodeName);
virtualNodes.put(hash, virtualNodeName);
}
}
}
public String getServerName(String key) {
int hash = getHash(key);
SortedMap<Integer, String> subMap = virtualNodes.tailMap(hash);
String virtualNode;
if(subMap.isEmpty()){
Integer i = virtualNodes.firstKey();
virtualNode = virtualNodes.get(i);
}else{
Integer i = subMap.firstKey();
virtualNode = subMap.get(i);
}
if(null != virtualNode){
return virtualNode.substring(0, virtualNode.indexOf("-VNode"));
}
return null;
}
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;
}
}
复制代码
划线
评论
复制
发布于: 2020 年 10 月 25 日阅读数: 37
CmHuang
关注
还未添加个人签名 2018.06.07 加入
还未添加个人简介
评论