package com.hash;

import java.util.Collection;

import java.util.SortedMap;

import java.util.TreeMap;

/**

 * 一致性Hash算法

 *

 * @param <T>
节点类型

 */

public class ConsistentHash<T> {


/** Hash计算对象,用于自定义hash算法 */


HashFunc hashFunc;


/** 复制的节点个数 */


private final int numberOfReplicas;


/** 一致性Hash环 */


private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();

/**


* 构造,使用Java默认的Hash算法


* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡


* @param nodes 节点对象


*/


public ConsistentHash(int numberOfReplicas, Collection<T> nodes) {


this.numberOfReplicas = numberOfReplicas;


this.hashFunc =new HashFunc(){


@Override


public Integer hash(Object key) {


return hashFunc.hash(key);


}};

//初始化节点


for (T node : nodes) {


add(node);


}


}

/**


* 构造


* @param hashFunc hash算法对象


* @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡


* @param nodes 节点对象


*/


public ConsistentHash(HashFunc hashFunc, int numberOfReplicas, Collection<T> nodes) {


this.numberOfReplicas = numberOfReplicas;


this.hashFunc = hashFunc;


//初始化节点


for (T node : nodes) {


add(node);


}


}

/**


* 增加节点<br>


* 每增加一个节点,就会在闭环上增加给定复制节点数<br>


* 例如复制节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node


* 由于hash算法会调用node的toString方法,故按照toString去重


* @param node 节点对象


*/


public void add(T node) {


for (int i = 0; i < numberOfReplicas; i++) {


circle.put(hashFunc.hash(node.toString() + i), node);


}


}

/**


* 移除节点的同时移除相应的虚拟节点


* @param node 节点对象


*/


public void remove(T node) {


for (int i = 0; i < numberOfReplicas; i++) {


circle.remove(hashFunc.hash(node.toString() + i));


}


}

/**


* 获得一个最近的顺时针节点


* @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点


* @return 节点对象


*/


public T get(Object key) {


if (circle.isEmpty()) {


return null;


}


int hash = hashFunc.hash(key);


if (!circle.containsKey(hash)) {


SortedMap<Integer, T> tailMap = circle.tailMap(hash);

//返回此映射的部分视图,其键大于等于 hash


hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();


}


//正好命中


return circle.get(hash);


}

/**


* Hash算法对象,用于自定义hash算法


*


*/


public interface HashFunc {


public Integer hash(Object key);


}

}

java 一致性哈希类实例 算法的更多相关文章

  1. 深入一致性哈希(Consistent Hashing)算法原理,并附100行代码实现

    转自:https://my.oschina.net/yaohonv/blog/1610096 本文为实现分布式任务调度系统中用到的一些关键技术点分享——Consistent Hashing算法原理和J ...

  2. 一致性哈希(consistent hashing)算法

    文章同步发表在博主的网站朗度云,传输门:http://www.wolfbe.com/detail/201608/341.html 1.背景        我们都知道memcached服务器是不提供分布 ...

  3. Java反射特性--获取其他类实例并调用其方法

    1. 代码结构 .├── com│   └── test│   └── MyTest.java└── MainCall.java 2. 代码内容 MyTest.java: package com.te ...

  4. 类实例调用静态方法(Java)

    前言 第一次看到在Java中是可以通过类实例调用静态方法,当然不推荐这么做,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录. 类实例调用静态方法 首先我们来看一个简单 ...

  5. 浅谈一致性哈希(My转)

    一致性哈希(Consistent hashing)算法是由 MIT 的Karger 等人与1997年在一篇学术论文(<Consistent hashing and random trees: d ...

  6. Dubbo一致性哈希负载均衡的源码和Bug,了解一下?

    本文是对于Dubbo负载均衡策略之一的一致性哈希负载均衡的详细分析.对源码逐行解读.根据实际运行结果,配以丰富的图片,可能是东半球讲一致性哈希算法在Dubbo中的实现最详细的文章了. 文中所示源码,没 ...

  7. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  8. 一致性哈希算法学习及JAVA代码实现分析

    1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...

  9. 一致性哈希算法原理及Java实现

     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单 ...

随机推荐

  1. Android Intent的花样启动

    刚开始看郭大神的<>,实现以下里面的一些例子.Intent的花样启动 显示Intent的使用. 实例化一个Intent,并且制定当前的activity和要跳转到的activity Inte ...

  2. jquery实现带左右箭头和数字焦点的图片轮播手写代码

    以前图片轮播经常用网上的插件,然后想说自己也要认真看看,一步一步弄明白,所以就自己研究写了个图片轮播的代码,我自己觉得还算是挺简单的.如有改进的地方,欢迎你能帮我指出,共同进步. (ps:博客园如何上 ...

  3. easyui的datagrid删除一条记录后更新出问题

    1.问题 如果先删除一条记录,然后不选中一条记录,去更新一条,默认是有选中的记录的,就是被删除的那条记录. 2.解决方法 $("#dg").datagrid('uncheckAll ...

  4. pycharm的激活

    ——————转———— Pycharm5注册方式   0x1 ,安装 0x2 , 调整时间到2038年. 0x3 ,申请30天试用 0x4, 退出pycharm 0x5, 时间调整回来. ##注册方法 ...

  5. Nginx 介绍和安装

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  6. 收敛 p75

    三种收敛.中心极限定理.大数定理.delta方法

  7. ASP.NET repeater添加序号列的方法

    ASP.NET repeater添加序号列的方法 1.<itemtemplate> <tr><td> <%# Container.ItemIndex + 1% ...

  8. svo:一个半直接单目视觉里程计(长期更新)

    源码:https://github.com/uzh-rpg/rpg_svo/tree/master/svo 视频:https://www.youtube.com/watch?v=2YnIMfw6bJY ...

  9. ShareSDK的简化压缩和使用样例

    share sdk 太大了  于是自己 開始简化,  删除了 ipad 的图片和 framework ,  压缩了 sharesdk 中的 图片,用几k的图片 替换了几个 200多k 的图片 仅仅保留 ...

  10. UI标签库专题十三:JEECG智能开发平台 ckfinder(ckfinder插件标签)

    1. ckfinder(ckfinder插件标签) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 name string 属性名称 是 null value string 默认值 否 nu ...