`
men4661273
  • 浏览: 278211 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一致性hash的Java实现

    博客分类:
  • java
阅读更多

关于一致性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:长沙

0
0
分享到:
评论

相关推荐

    一致性hashjava实现

    在这个Java实现中,我们看到的是Ketama一致性哈希算法,这是一种在实践中广泛应用的一致性哈希变体。 Ketama一致性哈希算法由Last.fm的工程师开发,其设计目标是优化分布式哈希表的性能,特别是在处理大量小键值对...

    一致性Hash简单实现

    2. **Java实现步骤** - **创建哈希函数**:选择合适的哈希函数,如`MD5`或`SHA`系列,将节点和键转换为环上的位置。 - **定义节点和虚拟节点**:每个真实节点都会对应多个虚拟节点,可以通过简单的哈希扩展实现,...

    Ketama一致性Hash算法(含Java代码) 1

    Ketama一致性哈希算法是基于一致性哈希的一种优化实现,主要解决了传统一致性哈希中节点分布不均匀的问题。在Ketama中,每个实际的物理服务器会被映射到多个虚拟节点,通常是100到200个,这些虚拟节点均匀分布在环上...

    对一致性Hash算法,Java代码实现的深入研究1

    对于Java实现一致性Hash算法,有几种可能的方法: 1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后...

    解决分布式数据插入数据库~一致性hash算法

    在Java实现中,一致性哈希通常会用到如Jedis、Voldemort等分布式存储库。这些库内部实现了哈希函数和虚拟节点的概念,虚拟节点可以看作是对实际节点的多次映射,增加了哈希空间的覆盖,使得数据分布更均匀。然而,...

    ConsistentHash:一致性hash算法的 java 和 C++ 实现

    在Java中实现一致性哈希,可以使用JDK自带的`java.util.HashMap`或者第三方库如Google的Guava库中的`com.google.common.hash.Hashing`类来计算哈希值。然后,为了实现环形结构,可以自定义一个`Node`类表示节点,并...

    PersistentIdealHashTree-Java实现

    2. 多线程并发测试:模拟并发插入和查询,检查数据一致性并评估性能。 3. 性能基准测试:度量插入、查询和更新操作的时间复杂度,以及在不同数据规模下的表现。 4. 持久化测试:确保在程序重启后,数据能够正确恢复...

    解决java 与C# MD5 不一致问题 代码

    ##### Java实现 ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Util { public static String getMD5(String str) { try { MessageDigest md ...

    SpringBoot_shardDB_shardTable:SpringBoot集成Sharding-JDBC实现分库分表,自定义分片算法,基于一致性hash算法,易于扩容

    一致性Hash算法,易于扩容;添加了 单元测试,使用Spring提供的RestTemplate调用RestFul风格的API接口;整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz....

    一致性哈希与Chord1

    【一致性哈希与Chord1】是一篇关于分布式哈希算法的文章,主要讨论了一致性哈希和普通哈希的区别,以及如何通过引入...在Java等编程语言中,一致性哈希可以用于实现高效、灵活的分布式服务,如缓存系统、负载均衡器等。

    哈希计算工具 java-hash.7z

    8. **分布式系统**: 在分布式系统中,如一致性哈希,哈希函数用于确定数据应存储在哪个节点上,以均衡负载并处理节点的增减。 9. **碰撞处理**: 虽然理想情况下哈希函数应确保每个输入都有唯一的哈希值,但实际上...

    PHP实现的一致性Hash算法详解【分布式算法】

    本文实例讲述了PHP实现的一致性Hash算法。分享给大家供大家参考,具体如下: 一致性哈希算法是分布式系统中常用的算法,为什么要用这个算法? 比如:一个分布式存储系统,要将数据存储到具体的节点(服务器)上, 在...

    哈希计算工具 java-hash

    哈希计算工具 `java-hash` 是一款基于Java编程语言实现的专门用于进行哈希值计算的软件。在软件开发和信息安全领域,哈希算法扮演着至关重要的角色,它能够将任意长度的数据转换为固定长度的输出,这个输出被称为...

    java实现的图片防篡改功能

    在这个项目中,我们主要探讨如何利用Java实现图片的防篡改功能,通过生成图片的唯一标识(哈希值)并进行比对来检测图片是否被篡改。 1. **哈希算法**: 哈希(Hash)函数是一种将任意长度的数据映射为固定长度...

    fly-arch:分布式架构consistent-hashing(一致性hash) http

    #fly-archflylib创立的各种常见的架构技术内容列表cassandra-demo cassandra数据库的入门编程consistent-hash Java implementation of consistent-hashing基于java的一致性hash的实现一致性hash(consistent-hashing)...

    JAVA与C#一致的32位MD5加密方法

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的信息映射为固定长度的输出,通常是一个128位的二进制数,以32位十六进制数的...因此,理解并正确实现这种一致性是非常关键的IT知识。

    Java开发中的Memcache原理及实现

    Java开发中的Memcached原理及实现主要涉及分布式缓存系统、内存管理和网络通信等多个技术领域。...不过,实际应用中还需考虑系统的整体架构、数据一致性、容错能力等因素,以实现最佳的缓存解决方案。

    MD5算法的Java实现类

    在压缩包中的"MD5算法的Java实现类"可能包含了上述的代码实现,你可以通过查看源码进一步理解MD5的Java实现细节。同时,也可以扩展这个实现,比如增加对大文件的分块处理,或者与其他哈希算法(如SHA-1、SHA-256)...

Global site tag (gtag.js) - Google Analytics