关于一致性hash的讲解有很多,也不难理解,具体可以翻看其他人写的这个文章
【转】http://limitlee.iteye.com/blog/1961385
自己动手写了一个java的实现过程,记录一下。
package com.xjw.consistent.hash; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.commons.codec.digest.DigestUtils; public class ConsistentHash { private SortedMap<Integer, String> serverNodeMap = null; private final static int VIRTUAL_NODE_NUMBER = 5; public void getServerNodeWithoutVirtualNode(List<String> servers) { serverNodeMap = new TreeMap<>(); for (String string : servers) { serverNodeMap.put(hash(string), string); } } public void getServerNodeWithVirtualNode(List<String> servers) { serverNodeMap = new TreeMap<>(); for (String string : servers) { for (int i = 0; i < VIRTUAL_NODE_NUMBER; i++) { String virtualNodeName = string + ":" + i; serverNodeMap.put(hash(virtualNodeName), string); } } } public String getServerName(String data) { int dataHash = hash(data); SortedMap<Integer, String> subMap = serverNodeMap.tailMap(dataHash); int serverHash = 0; if (subMap == null || subMap.size() == 0) { serverHash = serverNodeMap.firstKey(); }else { serverHash = subMap.firstKey(); } String serverName = serverNodeMap.get(serverHash); return serverName; } /** * hash计算,这里使用md5后取hashcode,这个md5需要依赖apache的codec包 * @param str * @return */ public int hash(String str) { return DigestUtils.md5Hex(str).hashCode(); } public static void main(String[] args) { List<String> servers = new ArrayList<>(); servers.add("192.168.1.1"); servers.add("192.168.1.2"); servers.add("192.168.1.3"); servers.add("192.168.1.4"); servers.add("192.168.1.5"); servers.add("192.168.1.6"); List<String> datas = new ArrayList<>(); datas.add("河南"); datas.add("山东"); datas.add("天津"); datas.add("北京"); datas.add("上海"); datas.add("广州"); datas.add("乌海"); datas.add("武汉"); datas.add("合肥"); datas.add("长沙"); ConsistentHash consistentHash = new ConsistentHash(); System.out.println("没有虚拟节点的情况:"); consistentHash.getServerNodeWithoutVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); System.out.println("有虚拟节点的情况:"); consistentHash.getServerNodeWithVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); servers.remove(0); System.out.println("移除第一个一个节点后:"); System.out.println("没有虚拟节点的情况:"); consistentHash.getServerNodeWithoutVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); System.out.println("有虚拟节点的情况:"); consistentHash.getServerNodeWithVirtualNode(servers); consistentHash.printDataAndServerNode(servers, datas, consistentHash); } public void printDataAndServerNode(List<String> servers, List<String> datas, ConsistentHash consistentHash) { Map<String, String> result = new HashMap<>(); for (String data : datas) { String serverName = consistentHash.getServerName(data); if (!result.containsKey(serverName)) { result.put(serverName, data); }else { result.put(serverName, result.get(serverName) + "," + data); } } for (Entry<String, String> entry : result.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } } }
输出结果为:
没有虚拟节点的情况:
192.168.1.1:河南,山东,广州
192.168.1.3:天津,合肥,长沙
192.168.1.4:北京,上海,乌海
192.168.1.6:武汉
有虚拟节点的情况:
192.168.1.1:上海
192.168.1.3:河南,天津,广州
192.168.1.2:山东,北京,乌海,合肥
192.168.1.5:武汉
192.168.1.6:长沙
移除第一个一个节点后:
没有虚拟节点的情况:
192.168.1.3:河南,山东,天津,广州,合肥,长沙
192.168.1.4:北京,上海,乌海
192.168.1.6:武汉
有虚拟节点的情况:
192.168.1.3:河南,天津,广州
192.168.1.2:山东,北京,乌海,合肥
192.168.1.5:上海,武汉
192.168.1.6:长沙
相关推荐
在这个Java实现中,我们看到的是Ketama一致性哈希算法,这是一种在实践中广泛应用的一致性哈希变体。 Ketama一致性哈希算法由Last.fm的工程师开发,其设计目标是优化分布式哈希表的性能,特别是在处理大量小键值对...
2. **Java实现步骤** - **创建哈希函数**:选择合适的哈希函数,如`MD5`或`SHA`系列,将节点和键转换为环上的位置。 - **定义节点和虚拟节点**:每个真实节点都会对应多个虚拟节点,可以通过简单的哈希扩展实现,...
Ketama一致性哈希算法是基于一致性哈希的一种优化实现,主要解决了传统一致性哈希中节点分布不均匀的问题。在Ketama中,每个实际的物理服务器会被映射到多个虚拟节点,通常是100到200个,这些虚拟节点均匀分布在环上...
对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...
在Java实现中,一致性哈希通常会用到如Jedis、Voldemort等分布式存储库。这些库内部实现了哈希函数和虚拟节点的概念,虚拟节点可以看作是对实际节点的多次映射,增加了哈希空间的覆盖,使得数据分布更均匀。然而,...
在Java中实现一致性哈希,可以使用JDK自带的`java.util.HashMap`或者第三方库如Google的Guava库中的`com.google.common.hash.Hashing`类来计算哈希值。然后,为了实现环形结构,可以自定义一个`Node`类表示节点,并...
2. 多线程并发测试:模拟并发插入和查询,检查数据一致性并评估性能。 3. 性能基准测试:度量插入、查询和更新操作的时间复杂度,以及在不同数据规模下的表现。 4. 持久化测试:确保在程序重启后,数据能够正确恢复...
一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....
##### Java实现 ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { public static String getMD5(String str) { try { MessageDigest md ...
【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入...在Java等编程语言中,一致性哈希可以用于实现高效、灵活的分布式服务,如缓存系统、负载均衡器等。
本文实例讲述了PHP实现的一致性Hash算法。分享给大家供大家参考,具体如下: 一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在...
哈希计算工具 `java-hash` 是一款基于Java编程语言实现的专门用于进行哈希值计算的软件。在软件开发和信息安全领域,哈希算法扮演着至关重要的角色,它能够将任意长度的数据转换为固定长度的输出,这个输出被称为...
8. **分布式系统**: 在分布式系统中,如一致性哈希,哈希函数用于确定数据应存储在哪个节点上,以均衡负载并处理节点的增减。 9. **碰撞处理**: 虽然理想情况下哈希函数应确保每个输入都有唯一的哈希值,但实际上...
在这个项目中,我们主要探讨如何利用Java实现图片的防篡改功能,通过生成图片的唯一标识(哈希值)并进行比对来检测图片是否被篡改。 1. **哈希算法**: 哈希(Hash)函数是一种将任意长度的数据映射为固定长度...
#fly-archflylib创立的各种常见的架构技术内容列表cassandra-demo cassandra数据库的入门编程consistent-hash Java implementation of consistent-hashing基于java的一致性hash的实现一致性hash(consistent-hashing)...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的信息映射为固定长度的输出,通常是一个128位的二进制数,以32位十六进制数的...因此,理解并正确实现这种一致性是非常关键的IT知识。
Java开发中的Memcached原理及实现主要涉及分布式缓存系统、内存管理和网络通信等多个技术领域。...不过,实际应用中还需考虑系统的整体架构、数据一致性、容错能力等因素,以实现最佳的缓存解决方案。
在压缩包中的"MD5算法的Java实现类"可能包含了上述的代码实现,你可以通过查看源码进一步理解MD5的Java实现细节。同时,也可以扩展这个实现,比如增加对大文件的分块处理,或者与其他哈希算法(如SHA-1、SHA-256)...