show me the code - 一致性hash
介绍
libketama在memcached客户端一致性hash算法中的运用。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| 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); } }
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)); } }
public T get(Object key) { if (circle.isEmpty()) { return null; } int hash = hashFunction.hash(key); SortedMap<Integer, T> tailMap = circle.tailMap(hash); hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey(); return circle.get(hash); }
}
|
参考
libketama