package com.baijob.commonTools;

import java.util.Collection;

import java.util.SortedMap;

import java.util.TreeMap;

/**

* 一致性Hash算法

* 算法详解:http://blog.csdn.net/sparkliang/article/details/5279393

* 算法实现:https://weblogs.java.net/blog/2007/11/27/consistent-hashing

* @author xiaoleilu

*

* @param 节点类型

*/

public class ConsistentHash {

/** Hash计算对象,用于自定义hash算法 */

HashFunc hashFunc;

/** 复制的节点个数 */

private final int numberOfReplicas;

/** 一致性Hash环 */

private final SortedMap circle = new TreeMap();

/**

* 构造,使用Java默认的Hash算法

* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡

* @param nodes 节点对象

*/

public ConsistentHash(int numberOfReplicas, Collection nodes) {

this.numberOfReplicas = numberOfReplicas;

this.hashFunc = new HashFunc() {

@Override

public Integer hash(Object key) {

String data = key.toString();

//默认使用FNV1hash算法

final int p = 16777619;

int hash = (int) 2166136261L;

for (int i = 0; i < data.length(); i++)

hash = (hash ^ data.charAt(i)) * p;

hash += hash << 13;

hash ^= hash >> 7;

hash += hash << 3;

hash ^= hash >> 17;

hash += hash << 5;

return hash;

}

};

//初始化节点

for (T node : nodes) {

add(node);

}

}

/**

* 构造

* @param hashFunc hash算法对象

* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡

* @param nodes 节点对象

*/

public ConsistentHash(HashFunc hashFunc, int numberOfReplicas, Collection nodes) {

this.numberOfReplicas = numberOfReplicas;

this.hashFunc = hashFunc;

//初始化节点

for (T node : nodes) {

add(node);

}

}

/**

* 增加节点

* 每增加一个节点,就会在闭环上增加给定复制节点数

* 例如复制节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node

* 由于hash算法会调用node的toString方法,故按照toString去重

* @param node 节点对象

*/

public void add(T node) {

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

circle.put(hashFunc.hash(node.toString() + i), node);

}

}

/**

* 移除节点的同时移除相应的虚拟节点

* @param node 节点对象

*/

public void remove(T node) {

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

circle.remove(hashFunc.hash(node.toString() + i));

}

}

/**

* 获得一个最近的顺时针节点

* @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点

* @return 节点对象

*/

public T get(Object key) {

if (circle.isEmpty()) {

return null;

}

int hash = hashFunc.hash(key);

if (!circle.containsKey(hash)) {

SortedMap tailMap = circle.tailMap(hash); //返回此映射的部分视图,其键大于等于 hash

hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();

}

//正好命中

return circle.get(hash);

}

/**

* Hash算法对象,用于自定义hash算法

* @author xiaoleilu

*

*/

public interface HashFunc {

public Integer hash(Object key);

}

}

java的hash算法实现_一致性Hash算法的Java实现详解相关推荐

  1. 从java多态到策略模式_设计模式中的多态——策略模式详解

    2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...

  2. 我的世界JAVA版有没有混凝土_我的世界1.12混凝土详解 混凝土合成教程

    我的世界1.12混凝土详解 混凝土合成教程.我的世界1.12新增加了方块混凝土,今天小编为大家带来了我的世界1.12版新方块混凝土详解和怎样合成的,还不清楚的玩家下面一起来看看吧! 游戏园我的世界官方 ...

  3. java富文本传图片_使用富文本编辑器上传图片实例详解

    富文本编辑器上传图片 一.导入kindeditor的js 二.将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个kindeditor对象 itemaddedit ...

  4. hash oracle 分表_一致性Hash算法在数据库分表中的实践

    最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...

  5. hash地址_一致性Hash在负载均衡中的应用

    作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...

  6. java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...

    原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...

  7. java中北大学ppt总结+课后习题第四章(小宇特详解)

    java中北大学ppt总结+课后习题第四章(小宇特详解) 继承 子类与父类 继承是根据现有类创建新的类的机制,由继承而得到的新类称为子类(subclass)或派生类(derived class),被继 ...

  8. 普利姆算法(prim)求最小生成树(MST)过程详解

    生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生 ...

  9. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

最新文章

  1. freemarker 读取字符串模板,(非文件)
  2. matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码
  3. AWS SDK for Java 2.0 使用的基础入门
  4. Last Theorem CodeForces - 1325F(dfs树找最大环+思维)
  5. ESI大学最新排名出炉:中国内地342所大学上榜!中国科学院大学排榜首!(附内地榜单)...
  6. request payload怎么发_做了一个个人博客,但不知道怎么介绍
  7. [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存
  8. python0x80070643_Win10提示Python 0x80070643安装时发生严重错误
  9. elasticsearch体验(一.初识elasticsearch)
  10. 【web组件库系列】封装自己的字体图标库
  11. ETF:一种让美国“80后”趋之若鹜的投资工具
  12. python建模预测_如何使用Python进行节目观众数的线性回归预测
  13. 深刻理解Binder机制
  14. Cox模型中的变量选择(1)---自适应Lasso方法
  15. dvwa页面打不开的原因_细看网页打不开的解决办法以及原因细看
  16. UE4超过20万个动画角色的优化实战
  17. 联邦学习 + 脏数据+Approaches to address the data skew problem in federated learning
  18. 怎么去除烦人的WPS广告
  19. cpu要和gpu搭配吗_高端显卡一定要配高档CPU吗?
  20. MATLAB程序:IEEE802.16d路径损耗模型

热门文章

  1. Python从入门到精通全套完整版教程(懂中文就能学会)
  2. # py自动创建日期文件夹用来记录自己的成长,以及如何打包成exe文件
  3. 最短路径之Floyd-Warshall算法
  4. 顺序存储二叉树的前序中序后序遍历
  5. 常见http错误代码及含义!!
  6. 打开浏览器突然多了个桔梗导航,怎么删除?
  7. 广联达bim5d手机端_广联达BIM5D手机端操作说明-生产首页
  8. 【关于某些网站上不去的问题解决】
  9. Android 12关闭Selinux
  10. Python玩转高德地图API(一)