文档章节

Java实现一致性Hash算法

dev_chao
 dev_chao
发布于 2017/03/26 15:46
字数 271
阅读 56
收藏 2

介绍就不多说了,网上一抓一大把。

下面是该算法的简单实现:

package com.devchao.hash;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Random;
import java.util.SortedMap;
import java.util.TreeMap;

public class Hash {

	public static void main(String[] args) {

		int real = 8, virtual = 100;// 8台真实机器,每台机器虚拟为100个节点
		int[] hit = new int[real];
		for (int i = 0; i < real; i++) {
			hit[i] = 0;// 每台机器命中率初始化为0
		}

		SortedMap<Long, Integer> virtualMap = new TreeMap<>();
		for (int i = 0; i < real; i++) {
			for (int j = 0; j < virtual; j++) {
				virtualMap.put(Math.abs(hash("real" + i + "virtual" + j)), i);
			}
		}

		for (int i = 0; i < 100000; i++) {
			SortedMap<Long, Integer> tailMap = virtualMap
					.tailMap(Math.abs(hash("uid-" + new Random().nextInt(10000000))));
			if (tailMap.isEmpty()) {
				hit[virtualMap.get(virtualMap.firstKey())]++;
			} else {
				hit[tailMap.get(tailMap.firstKey())]++;
			}
		}

		for (int i = 0; i < real; i++) {
			System.out.println("redis-" + i + ":" + hit[i]);
		}
	}

	/**
	 * MurMurHash算法,是非加密HASH算法,性能很高
	 */
	private static Long hash(String key) {

		ByteBuffer buf = ByteBuffer.wrap(key.getBytes());
		int seed = 0x1234ABCD;

		ByteOrder byteOrder = buf.order();
		buf.order(ByteOrder.LITTLE_ENDIAN);

		long m = 0xc6a4a7935bd1e995L;
		int r = 47;

		long h = seed ^ (buf.remaining() * m);

		long k;
		while (buf.remaining() >= 8) {
			k = buf.getLong();

			k *= m;
			k ^= k >>> r;
			k *= m;

			h ^= k;
			h *= m;
		}

		if (buf.remaining() > 0) {
			ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);
			finish.put(buf).rewind();
			h ^= finish.getLong();
			h *= m;
		}

		h ^= h >>> r;
		h *= m;
		h ^= h >>> r;

		buf.order(byteOrder);
		return h;
	}
}

参考:

【1】http://blog.csdn.net/cywosp/article/details/23397179/

© 著作权归作者所有

共有 人打赏支持
dev_chao
粉丝 4
博文 36
码字总数 11158
作品 0
广州
私信 提问
2019年阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

前言 一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对...

java知识分子
02/18
0
0
从jredis中学习一致性hash算法

jredis是redis的java客户端,通过sharde实现负载路由,一直很好奇jredis的sharde如何实现,翻开jredis源码研究了一番,所谓sharde其实就是一致性hash算法。其实,通过其源码可以看出一致性h...

温佐镜
2014/01/11
0
3
一致性Hash算法(KetamaHash)的c#实现

最近在研究"一致性HASH算法"(Consistent Hashing),用于解决memcached集群中当服务器出现增减变动时对散列值的影响。后来 在JAVAEYE上的一篇文章中,找到了其中的 KetamaHash 算法的JAVA实...

长平狐
2012/11/06
125
0
可视化的数据结构和算法

还记得之前发布过的那个关于可视化排序的文章吗?在网上又看到了一个旧金山大学David Galles做的各种可视化的数据结构和基本算法的主页,网址在这里,大家可以看看。我把这个页面的目录列在下...

戴威
2011/05/12
962
5
ConcurrentHashmap 解析

ConcurrentHashmap(JDK1.7) 总体描述:   concurrentHashmap是为了高并发而实现,内部采用分离锁的设计,有效地避开了热点访问。而对于每个分段,ConcurrentHashmap采用final和内存可见修...

令飞
2015/04/13
0
6

没有更多内容

加载失败,请刷新页面

加载更多

前端、后端和全栈到底不该学什么

1、前言 在职业规划咨询过程中经常会被问到这样的问题: 老师,我是该深入钻研专精一门,走技术大牛路线,还是所有都要精通,做一个全栈工程师? 类似问题的变种还有,老师我是不是该30岁最迟...

前端攻城小牛
30分钟前
3
0
【git命令】git-stash

应用场景 应用场景:使用git的时候,我们往往使用branch解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们...

echojson
32分钟前
2
0
centos7.3编译安装OpenSSL1.1.1b

简介 OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。 安装 下载:下载地址 ...

阿dai学长
33分钟前
1
0
0基础【转行】大数据

目前大数据行业异常火爆,不少人都对大数据充满了兴趣,其中有大部分人都是之前没有接触过计算机技术的,对编程语言也不太了解,那是不是这部分零基础的朋友就学不了大数据了呢?答案当然是否...

董黎明
34分钟前
1
0
Krpano 动态传参-action

效果解释:点击热点1,触发显示或隐藏热线2。 hotspot等标签允许编写自定义属性,这里直接设置自定义属性为dk=spot6,点击spot7,显示或隐藏spot6。 action方法体中,直接引用get(dk)即可获得...

华山猛男
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部