java实现hash一致性算法
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils; import java.util.*; /**
* 一致性hash
*/
public class ConsistentHashWithVirtualNode { /**
* 待添加入Hash环的服务器列表
*/ private static String[] SERVERS = {"192.168.1.2:6379", "192.168.1.3:6379"}; /**
* key表示服务器的hash值,value表示虚拟节点的名称
*/
private static SortedMap<Integer, String> HASH_CIRCLE = new TreeMap<Integer, String>();
/**
* 用于结果统计
*/
private static Map<String, Integer> result = new HashMap<String, Integer>();
/**
* 每个真实节点对应虚拟节点数
*/
private static Integer VIRTUAL_NODES_NUM = 150; /**
* 使用FNV1_32_HASH算法计算服务器的Hash值
*/
private static int getHash(String str) {
final int p = 16777619;
int hash = (int) 2166136261L;
for (int i = 0; i < str.length(); i++)
hash = (hash ^ str.charAt(i)) * p;
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5; // 如果值为负数则取其绝对值
if (hash < 0)
hash = Math.abs(hash);
return hash;
} static {
for (int i = 0; i < SERVERS.length; i++) {
for (Integer j = 0; j < VIRTUAL_NODES_NUM; j++) {
setServer(SERVERS[i] + "vn" + j);
}
}
} private static void setServer(String ip) {
setServer(ip, null);
} private static void setServer(String ip, Integer hash) {
hash = hash != null ? getHash(hash.toString()) : getHash(ip);
if (StringUtils.isBlank(HASH_CIRCLE.get(hash))) {
HASH_CIRCLE.put(hash, ip);
System.out.println("[" + ip + "]加入sortedMap中, 其Hash值为" + hash);
} else {
//解决hash碰撞
setServer(ip, hash);
}
} public static void main(String[] args) {
for (int i = 0; i < 50; i++) {
long nodes = RandomUtils.nextLong();
String server = getServer(nodes);
String realServer = server.split("vn")[0];
System.out.println("[" + nodes + "]的hash值为" + getHash("" + nodes) + ", 被路由到虚拟结点[" + server + "], 真实结点[" + realServer + "]");
result.put(realServer, (result.get(realServer) == null ? 0 : result.get(realServer)) + 1);
}
result.forEach((k, v) -> {
System.out.println("结点[" + k + "]上有" + v);
});
} public static String getServer(Object node) {
String ip = HASH_CIRCLE.get(HASH_CIRCLE.firstKey());
// 得到带路由的结点的Hash值
int hash = getHash(node.toString());
// 得到大于该Hash值的所有Map
SortedMap<Integer, String> subMap = HASH_CIRCLE.tailMap(hash); if (!subMap.isEmpty()) {
// 第一个Key就是顺时针过去离node最近的那个结点
Integer i = subMap.firstKey();
ip = subMap.get(i);
}
// 返回对应的服务器名称
return ip;
}
}
java实现hash一致性算法的更多相关文章
- 【java】安全加密MessageDigest的功能及用法【hash一致性算法】
链接地址:https://blog.csdn.net/ma1kong/article/details/2662997 1.查看MessageDigest源码的注释说明 2.和hash一致性算法 什么关 ...
- 【hash】什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法【关于hash的详解】
什么是hash,什么是哈希,什么是hash散列,什么是hash一致性算法
- hash一致性算法
一致性hash算法是,1097麻省理工提出的分布式hashDHT实现算法,极倔internet的热点问题 平衡性 hash结果尽可能的分布到所有的缓存中去,缓冲空间利用率最高 单调性 保持已有的缓存能 ...
- 【Hash一致性算法】什么是Hash一致性算法
目录 1. 一致性Hash算法简介 环形Hash空间 把数据通过一定的hash算法处理后映射到环上 将机器通过hash算法映射到环上 机器的删除与添加 平衡性 本文转载自博客 1. 一致性Hash算法 ...
- Hash一致性算法底层原理
大纲 Hash取余算法 判定哈希算法好坏的四个定义 一致性Hash算法的两大设计 Hash取余算法 hash(Object.key)%N,hash值随Object.key.N的变化而变化. 如果有节点 ...
- 【java】hash一致性算法的实现区别【标题暂定】
下面两个都是在生成sign签名时候用到的方式,有什么区别? 第一种: import org.apache.commons.codec.digest.DigestUtils; String sign = ...
- redis 集群引出hash一致性算法
写的很棒的文章 https://blog.csdn.net/bntX2jSQfEHy7/article/details/79549368 这篇分析的更叼 https://www.jianshu.com ...
- nginx+php+memcache实现hash一致性memcache 集群
我们工作中可能会遇到key-value数据库,如果我们面对的不止一台memcache服务器,而是很多台.那么现在就回出现一个问题: 当我们访问nginx服务器的时候,我们会判断memcache中是否有 ...
- 11.redis cluster的hash slot算法和一致性 hash 算法、普通hash算法的介绍
分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 一.hash 算法 来了一 ...
随机推荐
- 2、rbac组件 后台布局模板,权限按钮,菜单,可拔插,路径重定向
1.后台布局管理 https://www.cnblogs.com/venicid/p/7772742.html#_label0 1.通用模板 overflow: auto; //在a和b模板中进行切换 ...
- 新买的orico蓝牙usb连接器使用方法与驱动
因为买的型号是 BTA-403 ,所以需要下载该型号驱动 安装好后,可能会出现找不到蓝牙设备问题,所以需要重启机器,并且手动将pc蓝牙连接到手机蓝牙,然后手机蓝牙再连接蓝牙耳机,此时蓝牙耳机会显示连接 ...
- [Luogu1891]疯狂LCM[辗转相减法]
题意 多组询问,每次给定 \(n\) ,求:\(\sum_{i=1}^nlcm(i,n)\) . \(\rm T \leq 3\times 10^4\ ,n \leq 10^6\). 分析 推式子: ...
- CSS3设置背景图片的大小
设置背景图片的大小,以长度值或百分比显示,还可以通过cover和contain来对图片进行伸缩. background-size 语法详解: 要在插入图片之后进行设置背景图片的大小 backgroun ...
- webpack vue app.js自动注入页面.为app.js增加随机参数
node_modules/html-webpack-plugin/index.js 搜索 postProcessHtml 修改代码增加如下: if (assetTags && asse ...
- 通俗地讲Node.js是什么
前后端分离,使得后台只需关注服务即可,但有时候开发的不同步,前台往往需要等待后台的接口,通俗的说,“node.js就是一个前端觉得写个功能还要等后端捣鼓半天,然后干脆就自己用javascript把后端 ...
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- 简单的redis工具类
import java.util.Arrays; import java.util.List;import java.util.Set; import org.apache.commons.lang. ...
- JDK 和 JRE 有什么区别
JDK是Java开发工具包(Java Development Kit),JRE是Java运行环境(Java Runtime Environment),JDK包含了JRE,搭建Java环境的时候,安装J ...
- Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 78,050,512 milliseconds ago.
今天访问已经架上服务器的网站,报错: Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet s ...