一致性Hash

来源:互联网 发布:类似简图的软件 编辑:程序博客网 时间:2024/06/04 20:54

理解一致性哈希算法(consistent hashing)

关于TreeMap和一致性hash

某分布式应用实践一致性哈希的一些问题


public interface HashFunction {int hash(String hash);}


import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap;public class ConsistentHash<T> {  private final HashFunction hashFunction;//hash算法接口,可使用MD5 SHA1 SHA256,MurmurHash等算法  private final int numberOfReplicas;// 每个机器节点关联的虚拟节点个数  private final SortedMap<Integer, T> circle =    new TreeMap<Integer, T>();// 虚拟节点  public ConsistentHash(HashFunction hashFunction,    int numberOfReplicas, Collection<T> nodes) {    this.hashFunction = hashFunction;    this.numberOfReplicas = numberOfReplicas;    for (T node : nodes) {      add(node);    }  }  //添加新的机器节点  public void add(T node) {    for (int i = 0; i < numberOfReplicas; i++) {      circle.put(hashFunction.hash(node.toString() + i),        node);    }  }  //删除某机器节点  public void remove(T node) {    for (int i = 0; i < numberOfReplicas; i++) {      circle.remove(hashFunction.hash(node.toString() + i));    }  }  //查找待存储key对应的机器节点  public T get(Object key) {    if (circle.isEmpty()) {      return null;    }    int hash = hashFunction.hash(key.toString());    if (!circle.containsKey(hash)) {      // 沿环的顺时针找到一个虚拟节点,环中不存在使用环中的第一个key      SortedMap<Integer, T> tailMap =        circle.tailMap(hash);      hash = tailMap.isEmpty() ?             circle.firstKey() : tailMap.firstKey();    }    return circle.get(hash);  } }


0 0