风也温柔

计算机科学知识库

一致性hash算法 java java实现一致性hash算法实例代码

  java实现一致性hash算法实例

  一致性hash算法java版本简单实现

  java实现一致性hash算法实例代码

   com...;

   java.util.;

   java.util.List;

   java.util.;

   java.util.;

   org.slf4j.;

   org.slf4j.;

  /**

  * 一致性hash算法java简易实现

  * @ IT云清

  * 参考:

  */

   class {

   final = .(.class);

  /**

  * 虚拟节点个数

  * 每个真实节点对应的虚拟节点个数

  */

   final int = 5;

  /**

  * 虚拟节点

  * eg:

  * 真实节点数量一般偏少一致性hash算法 java,引入虚拟节点来平衡

  * 每个真实节点对应多个虚拟节点,这样每个节点尽可能在hash环上均匀分布,可以根据虚拟节点找到真实节点

  */

   = new ();

  /**

  * 真实节点

  */

   List = new ();

  /**

  * 模拟初始节点

  */

   [] = {"116.116.1.1", "116.116.1.2", "116.116.1.3", "116.116.1.5", "116.116.1.6"};

  /**

  * 初始化虚拟节点

  */

   {

  for ( : ) {

  .add();

  ("添加真实节点{}",);

  for(int i = 0;i < ; i ++){

   = + "&&VN" + i;

  int hash = ();

  .put(hash,);

  ("添加虚拟节点{},hash为{}",,hash);

  }

  }

  }

   void main([]args){

  test2();

  }

   void test2(){

  //测试定位node

  (("aa"));

  (("涨三"));

  ((""));

  ((""));

  ("------------------");

  //测试添加节点

  ("192.192.116.1");

  ("192.192.116.2");

  ("------------------");

  //测试删除节点

  ("116.116.1.1");

  }

  /**

  * 获取真实节点ip

  * @param str 字符串

  * @

  */

   ( str){

  //计算hash

  int hash = (str);

   key = null;

  //寻找最近的虚拟node

   = .(hash);

  //获取在hash环上 右侧最近的虚拟节点的key

  key = .() ? .() : .();

  //根据hash获取虚拟节点

   = .get(key);

  //返回虚拟节点的真实ip

   .(0,.("&&"));

  }

  /**

  * 添加节点

  * @param node

  */

   void ( node){

  if(!.(node)){

  .add(node);

  ("新增真实节点上线,{}",node);

  for(int i = 0;i < ;i ++){

   = node + "&&VN" + i;

  int hash = ();

  .put(hash,);

  ("新增虚拟节点{}一致性hash算法 java java实现一致性hash算法实例代码,hash为{}",,hash);

  }

  }

  }

  /**

  * 删除节点

  * @param node

  */

   void ( node){

  if(.(node)){

  //下线真实节点

  .(node);

  ("真实节点下线,{}",node);

  for(int i = 0;i < ; i++){

   = node + "&&VN" + i;

  int hash = ();

  //移除虚拟节点

  .(hash);

  ("下线虚拟节点{}一致性hash算法 java,hash为{}",,hash);

  }

  }

  }

  /**

  * 算法

  * @param str 任意字符串

  * @ 返回int类型的hash值

  */

   int ( str) {

  final int p = ;

  int hash = (int) ;

  for (int i = 0; i < str.(); i++) {

  hash = (hash ^ str.(i)) * p;

  }

  hash += hash > 7;

  hash += hash > 17;

  hash += hash

  文章来源:https://www.eolink.com/news/post/44654.html