一致性hash
来源:互联网 发布:男士手表推荐 知乎 编辑:程序博客网 时间:2024/06/07 15:01
仅作个人学习记录
package ConsistentHashRouter;/** * Created by jc6a on 2017/10/17. */public class PhysicalNode { private String ip; private int port; public PhysicalNode(String ip,int port){ this.ip = ip; this.port = port; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public int getPort() { return port; } public void setPort(int port) { this.port = port; }}
package ConsistentHashRouter;/** * Created by jc6a on 2017/10/17. */public class VirtualNode { private int replicaNumber; private PhysicalNode parent; public VirtualNode(PhysicalNode parent,int replicaNumber){ this.parent = parent; this.replicaNumber = replicaNumber; } public boolean matches(String host){ return parent.toString().equalsIgnoreCase(host); } public int getReplicaNumber() { return replicaNumber; } public void setReplicaNumber(int replicaNumber) { this.replicaNumber = replicaNumber; } public PhysicalNode getParent() { return parent; } public void setParent(PhysicalNode parent) { this.parent = parent; }}
package ConsistentHashRouter;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Iterator;import java.util.SortedMap;import java.util.TreeMap;/** * Created by jc6a on 2017/10/17. */public class ConsistentHashRouter { private SortedMap<Long,VirtualNode> ring = new TreeMap<>(); private MD5Hash hashfunction = new MD5Hash(); public ConsistentHashRouter(){ } public void addNode(PhysicalNode physicalNode,int vnodeCount){ int existingReplicas = getReplicas(physicalNode.toString()); for(int i=0;i<vnodeCount;i++){ VirtualNode virtualNode = new VirtualNode(physicalNode,i+existingReplicas); ring.put(hashfunction.hash(virtualNode.toString()),virtualNode); } } public PhysicalNode getNode(String key){ if(ring.isEmpty()){ return null; } Long hashKey = hashfunction.hash(key); SortedMap<Long,VirtualNode> tailMap = ring.tailMap(hashKey); hashKey = tailMap!=null&&!tailMap.isEmpty()?tailMap.firstKey():ring.firstKey(); return ring.get(hashKey).getParent(); } public void removeNode(PhysicalNode physicalNode){ Iterator<Long> it = ring.keySet().iterator(); while(it.hasNext()){ Long key = it.next(); VirtualNode virtualNode = ring.get(key); if(virtualNode.matches(physicalNode.toString())){ it.remove(); } } } public int getReplicas(String nodeName){ int replicas = 0; for(VirtualNode node : ring.values()){ if(node.matches(nodeName)){ replicas++; } } return replicas; } private static class MD5Hash{ MessageDigest instance; public MD5Hash(){ try { instance = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } long hash(String key){ instance.reset(); instance.update(key.getBytes()); byte[] digest = instance.digest(); long h = 0; for(int i=0;i<4;i++){ h <<= 8; h |= ((int)digest[i])&0xFF; } return h; } }}
阅读全文
0 0
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性 hash
- 一致性Hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- 一致性hash
- Spring MVC整合FreeMark 视图解析器
- 入职相关
- Shiro 权限控制
- Android 动画部分
- spring-boot + websocket 打包问题汇总
- 一致性hash
- A
- SpringBoot学习笔记(一)
- Java SE (一)——标识符、关键字、类型
- android 自定义组合控件
- Android自定义手势密码
- 进行Heroku部署时--配置数据库出现:no app specified
- 基于nginx的中间件架构(2)nginx的介绍与安装
- CSS+DIV布局