• 一致性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() + "个" ); 
                } 
          } 
     

  • 相关阅读:
    C# WinForm界面上实现按条件检索数据
    DevExpress中XtraEditors.RadioGroup 控件如何保存获取选中的值及读取数据库中的值
    在QTP Test中利用vbs和cmd实现重新启动QTP
    VBS操作Excel的一点问题总结
    利用vbs维护qtp的虚拟对象的坐标
    Smoke Test和BVT Test的区别
    小结一下VS2012新开发环境的设置经历
    关闭EF4.x Code First的级联删除Cascade Delete
    关于Entity Framework 4.0/4.1数据验证的一点体会
    CentOS 6.3 Minimal yum 安装 PostgreSQL 9.2.3
  • 原文地址:https://www.cnblogs.com/weiwelcome0/p/ConsistentHash.html
Copyright © 2020-2023  润新知