读书人

一致性hash之java兑现

发布时间: 2012-09-01 09:33:03 作者: rapoo

一致性hash之java实现

一致性hash的原理 把server和key hash到同一个空间,然后同方向找最近的即可。

import java.util.Collection;  import java.util.SortedMap;  import java.util.TreeMap;    public class ConsistentHash<T> {        private final HashFunction hashFunction;      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);          }      }      /**      * 把一个实际节点映射到多个位置上,多个位置的都指向到一个相同的节点。      * @param 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获得它的将要存储的节点      * @param key      * @return      */      public T get(Object key) {          if (circle.isEmpty()) {              return null;          }          int hash = hashFunction.hash(key);          if (!circle.containsKey(hash)) {              SortedMap<Integer, T> tailMap = circle.tailMap(hash);              hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();          }          return circle.get(hash);      }    }  
?

读书人网 >编程

热点推荐