一致性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;        }    }}





原创粉丝点击