写点什么

架构师训练营第五周作业

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

题目


  1. 用你熟悉的编程语言实现一致性 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; } }
复制代码


用户头像

CmHuang

关注

还未添加个人签名 2018.06.07 加入

还未添加个人简介

评论

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