import java.util.List; import java.util.SortedMap; import java.util.TreeMap; /** * * @author <a href="mailto:yankai913@gmail.com">yankai</a> * @date 2013-7-6 */ public class ConsistentHash { final SortedMap<Integer, String> virtualNodes = new TreeMap<Integer, String>(); final int virtualMappingNo = 10 ; final List<String> realNodes; public ConsistentHash(List<String> realNodes) { for (String node : this .realNodes) { addNode(node); } } int hash(String key) { return key.hashCode(); } void addNode(String node) { for ( int i = 0 ; i < virtualMappingNo; i++) { virtualNodes.put(hash(node + i), node); } realNodes.add(node); } void removeNode(String node) { for ( int i = 0 ; i < virtualMappingNo; i++) { virtualNodes.remove(hash(node + i)); } realNodes.remove(node); } String get(String key) { int hash = hash(key); if (virtualNodes.containsKey(hash)) { return virtualNodes.get(hash); } SortedMap<Integer, String> tail = virtualNodes.tailMap(hash); if (tail.isEmpty()) { return virtualNodes.get(virtualNodes.firstKey()); } return tail.get(tail.firstKey()); } } |