• 一致性hash算法(JAVA)


     本文来自http://www.iteye.com/topic/1132274,版权原作者所有

    Java代码
    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); 
                 // System.out.println("hash---: " + hash); 
                 if (!circle .containsKey(hash)) { 
                      SortedMap<Integer, T> tailMap = circle .tailMap(hash); 
                      hash = tailMap.isEmpty() ? circle .firstKey() : tailMap.firstKey(); 
                } 
                 // System.out.println("hash---: " + hash); 
                 return circle .get(hash); 
          } 
     
           static class HashFunction { 
                 int hash(Object key) {
                       //md5加密后,hashcode
                       return Md5Encrypt.md5(key.toString()).hashCode(); 
                } 
          } 
     
           public static void main(String [] args) { 
                HashSet< String> set = new HashSet< String>(); 
                set.add( "A" ); 
                set.add( "B" ); 
                set.add( "C" ); 
                set.add( "D" ); 
     
                Map< String, Integer> map = new HashMap< String, Integer>(); 
     
                ConsistentHash< String> consistentHash = new ConsistentHash<String>( new HashFunction(), 1000, set); 
     
                 int count = 10000; 
     
                 for (int i = 0; i < count; i++) { 
                       String key = consistentHash.get(i); 
                       if (map.containsKey(key)) { 
                            map.put(consistentHash.get(i), map.get(key) + 1); 
                      } else { 
                            map.put(consistentHash.get(i), 1); 
                      } 
                       // System.out.println(key); 
                } 
     
                 showServer(map); 
                map.clear(); 
                consistentHash.remove( "A" ); 
     
                System. out .println("------- remove A" ); 
     
                 for (int i = 0; i < count; i++) { 
                       String key = consistentHash.get(i); 
                       if (map.containsKey(key)) { 
                            map.put(consistentHash.get(i), map.get(key) + 1); 
                      } else { 
                            map.put(consistentHash.get(i), 1); 
                      } 
                       // System.out.println(key); 
                } 
     
                 showServer(map); 
                map.clear(); 
                consistentHash.add( "E" ); 
                System. out .println("------- add E" ); 
     
                 for (int i = 0; i < count; i++) { 
                       String key = consistentHash.get(i); 
                       if (map.containsKey(key)) { 
                            map.put(consistentHash.get(i), map.get(key) + 1); 
                      } else { 
                            map.put(consistentHash.get(i), 1); 
                      } 
                       // System.out.println(key); 
                } 
     
                 showServer(map); 
                map.clear(); 
     
                consistentHash.add( "F" ); 
                System. out .println("------- add F服务器  业务量加倍" ); 
                count = count * 2; 
                 for (int i = 0; i < count; i++) { 
                      String key = consistentHash.get(i); 
                       if (map.containsKey(key)) { 
                            map.put(consistentHash.get(i), map.get(key) + 1); 
                      } else { 
                            map.put(consistentHash.get(i), 1); 
                      } 
                       // System.out.println(key); 
                } 
     
                 showServer(map); 
     
          } 
     
           public static void showServer(Map<String , Integer> map) { 
                 for (Entry<String, Integer> m : map.entrySet()) { 
                      System. out .println("服务器 " + m.getKey() + "----" + m.getValue() + "个" ); 
                } 
          } 
     

  • 相关阅读:
    RabbitMQ入门-消息订阅模式
    RabbitMQ入门-消息派发那些事儿
    RabbitMQ入门-高效的Work模式
    RabbitMQ入门-从HelloWorld开始
    RabbitMQ入门-初识RabbitMQ
    CMake INSTALL 命令设置exe dll lib的安装位置
    VS调试DLL代码使用”附加到进程“
    模型自身面片重合引起的闪烁破损解决方法
    地球表面使用世界坐标系绘制物体闪烁破损处理方法
    3dmax osg格式导出插件 osgExp OpenSceneGraph Max Exporter
  • 原文地址:https://www.cnblogs.com/weiwelcome0/p/ConsistentHash.html
Copyright © 2020-2023  润新知