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

一致性HASH算法的JAVA实现

 
阅读更多
        一致性哈希算法是分布式系统中常用的算法。比如,一个分布式的存储系统,要将数据存储到具体的节点上,如果采用普通的hash方法,将数据映射到具体的节点上,如key%N,key是数据的key,N是机器节点数,如果有一个机器加入或退出这个集群,则所有的数据映射都无效了,如果是持久化存储则要做数据迁移,如果是分布式缓存,则其他缓存就失效了。
        一致性Hash算法将 value 映射到一个 32 为的 key 值,也即是 0~2^32-1 次方的数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环。
如下图所示:






package hash;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 * Created by IntelliJ IDEA.
 * User: test
 * Date: 12-5-24
 * Time: 下午5:37
 * To change this template use File | Settings | File Templates.
 */
public class ConsistencyHash {
    private TreeMap<Long,Object> nodes = null;
    //真实服务器节点信息
    private List<Object> shards = new ArrayList();
    //设置虚拟节点数目
    private int VIRTUAL_NUM = 4;

    /**
     * 初始化一致环
     */
    public void init() {
         shards.add("192.168.0.0-服务器0");
         shards.add("192.168.0.1-服务器1");
         shards.add("192.168.0.2-服务器2");
         shards.add("192.168.0.3-服务器3");
         shards.add("192.168.0.4-服务器4");

        nodes = new TreeMap<Long,Object>();
        for(int i=0; i<shards.size(); i++) {
            Object shardInfo = shards.get(i);
            for(int j=0; j<VIRTUAL_NUM; j++) {
                nodes.put(hash(computeMd5("SHARD-" + i + "-NODE-" + j),j), shardInfo);
            }
        }
    }

    /**
     * 根据key的hash值取得服务器节点信息
     * @param hash
     * @return
     */
    public Object getShardInfo(long hash) {
        Long key = hash;
        SortedMap<Long, Object> tailMap=nodes.tailMap(key);
		if(tailMap.isEmpty()) {
			key = nodes.firstKey();
		} else {
			key = tailMap.firstKey();
		}
        return nodes.get(key);
    }

    /**
     * 打印圆环节点数据
     */
     public void printMap() {
         System.out.println(nodes);
     }

    /**
     * 根据2^32把节点分布到圆环上面。
     * @param digest
     * @param nTime
     * @return
     */
      public long hash(byte[] digest, int nTime) {
		long rv = ((long) (digest[3+nTime*4] & 0xFF) << 24)
				| ((long) (digest[2+nTime*4] & 0xFF) << 16)
				| ((long) (digest[1+nTime*4] & 0xFF) << 8)
				| (digest[0+nTime*4] & 0xFF);

		return rv & 0xffffffffL; /* Truncate to 32-bits */
	  }

	/**
	 * Get the md5 of the given key.
     * 计算MD5值
	 */
	 public byte[] computeMd5(String k) {
		MessageDigest md5;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			throw new RuntimeException("MD5 not supported", e);
		}
		md5.reset();
		byte[] keyBytes = null;
		try {
			keyBytes = k.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException("Unknown string :" + k, e);
		}

		md5.update(keyBytes);
		return md5.digest();
	 }

     public static void main(String[] args) {
         Random ran = new Random();
         ConsistencyHash hash = new ConsistencyHash();
         hash.init();
         hash.printMap();
         //循环50次,是为了取50个数来测试效果,当然也可以用其他任何的数据来测试
         for(int i=0; i<50; i++) {
             System.out.println(hash.getShardInfo(hash.hash(hash.computeMd5(String.valueOf(i)),ran.nextInt(hash.VIRTUAL_NUM))));
         }
   }

}


分享到:
评论

相关推荐

    一致性hashjava实现

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

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

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

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

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

    一致性Hash简单实现

    一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT)的算法,它主要应用于分布式缓存、负载均衡等场景,旨在解决在动态扩展或收缩系统规模时,尽量减少数据迁移的问题。在这个简单的实现中,我们将探讨如何...

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

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

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

    在这个场景下,我们将深入探讨一致性哈希算法的原理、特点以及在Java和C++中的实现。 一致性哈希算法的基本思想是将哈希空间环绕成一个虚拟的圆环,每个节点都被分配到这个环上的一个或多个位置。当需要将数据映射...

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

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

    MD5算法的Java实现类

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

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

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

    SHA-256加密算法JAVA

    SHA-256是一种广泛使用的密码散列函数,属于SHA-2家族的一部分,设计目的是为了提供数字签名和数据完整性验证。...在实际应用中,可以对文本、文件等内容进行SHA-256哈希,确保数据的完整性和一致性。

    ConsistentHash:一致性hash算法案例

    一致性哈希(Consistent Hashing)是一种分布式哈希表(DHT, Distributed Hash Table)的算法,主要用于解决在分布式系统中数据分片、负载均衡、缓存分发等问题。在云计算和大数据领域,一致性哈希算法有着广泛的应用,...

    JAVA上加密算法的实现用例.doc

    在Java中实现加密算法涉及到多个重要的概念和技术,包括单钥密码体制、消息摘要、Diffie-Hellman密钥一致协议、非对称算法和公钥体系以及数字签名。下面将详细阐述这些知识点。 **1. 单钥密码体制** 单钥密码体制,...

    哈希计算工具 java-hash

    `java-hash` 工具可能包含了这些常见哈希算法的实现,以及可能的自定义优化,提供了一种便捷的方式来计算和比较哈希值。通过这个工具,开发者可以轻松地集成哈希计算到他们的项目中,提高工作效率,确保数据的安全性...

    Java语言Consistent Hash算法学习笔记(代码示例)

    下面我们将深入探讨一致性哈希算法的原理、特点以及Java实现。 一致性哈希算法的核心思想是将数据和服务器都映射到一个固定大小的哈希环上,数据根据其哈希值被分配到最近的服务器节点。当新增或移除服务器时,只有...

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

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

    PersistentIdealHashTree-Java实现

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

    jenkins-hash-java:Jenkins的哈希值产生32位和64位值

    詹金斯·哈希非加密目的Bob Jenkins哈希的Java实现。 此实现可产生32位和64位哈希值,并可用于哈希表查找。 此处实现的算法是32位体系结构的理想选择。什么是詹金斯哈希? Jenkins哈希是由Bob Jenkins创建的通用哈希...

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

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

Global site tag (gtag.js) - Google Analytics