java的hash算法实现_一致性Hash算法的Java实现详解
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实现详解相关推荐
- 从java多态到策略模式_设计模式中的多态——策略模式详解
2. 策略模式详解 2.1 策略模式定义 策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户端而独立的变化. 可以使用多态进行类比来理解策略模 ...
- 我的世界JAVA版有没有混凝土_我的世界1.12混凝土详解 混凝土合成教程
我的世界1.12混凝土详解 混凝土合成教程.我的世界1.12新增加了方块混凝土,今天小编为大家带来了我的世界1.12版新方块混凝土详解和怎样合成的,还不清楚的玩家下面一起来看看吧! 游戏园我的世界官方 ...
- java富文本传图片_使用富文本编辑器上传图片实例详解
富文本编辑器上传图片 一.导入kindeditor的js 二.将kindeditor与一个文本域textarea进行关联,即用textarea初始化一个kindeditor对象 itemaddedit ...
- hash oracle 分表_一致性Hash算法在数据库分表中的实践
最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...
- hash地址_一致性Hash在负载均衡中的应用
作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...
- java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...
原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...
- java中北大学ppt总结+课后习题第四章(小宇特详解)
java中北大学ppt总结+课后习题第四章(小宇特详解) 继承 子类与父类 继承是根据现有类创建新的类的机制,由继承而得到的新类称为子类(subclass)或派生类(derived class),被继 ...
- 普利姆算法(prim)求最小生成树(MST)过程详解
生活中最小生成树的应用十分广泛,比如:要连通n个城市需要n-1条边线路,那么怎么样建设才能使工程造价最小呢?可以把线路的造价看成权值求这几个城市的连通图的最小生成树.求最小造价的过程也就转化成求最小生 ...
- python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...
最新文章
- freemarker 读取字符串模板,(非文件)
- matlab蚁群算法 路径规划,基于蚁群算法的机器人路径规划MATLAB源码
- AWS SDK for Java 2.0 使用的基础入门
- Last Theorem CodeForces - 1325F(dfs树找最大环+思维)
- ESI大学最新排名出炉:中国内地342所大学上榜!中国科学院大学排榜首!(附内地榜单)...
- request payload怎么发_做了一个个人博客,但不知道怎么介绍
- [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存
- python0x80070643_Win10提示Python 0x80070643安装时发生严重错误
- elasticsearch体验(一.初识elasticsearch)
- 【web组件库系列】封装自己的字体图标库
- ETF:一种让美国“80后”趋之若鹜的投资工具
- python建模预测_如何使用Python进行节目观众数的线性回归预测
- 深刻理解Binder机制
- Cox模型中的变量选择(1)---自适应Lasso方法
- dvwa页面打不开的原因_细看网页打不开的解决办法以及原因细看
- UE4超过20万个动画角色的优化实战
- 联邦学习 + 脏数据+Approaches to address the data skew problem in federated learning
- 怎么去除烦人的WPS广告
- cpu要和gpu搭配吗_高端显卡一定要配高档CPU吗?
- MATLAB程序:IEEE802.16d路径损耗模型