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. MYSQL设置字段数据过长自动截断

    自动截断如下设置: windows: 修改my.ini: [mysqld] sql-mode="STRICT_TRANS_TABLES" linux: 修改/ect/mysql/m ...

  2. ecshop使用Google API及OAuth2.0登录授权(PHP)

    一.申请clientID https://console.developers.google.com/project 二.开启Google+ API权限 https://console.develop ...

  3. AWS之EC2远程登录

    网上有丰富的免费资源,Amazon的云主机就是开发者和学习者很好的选择. 但你得有一张信用卡,注册个AWS(Amazon web service)账号,就可以有自己公网ip的服务器了!!! 最近在折腾 ...

  4. C#内存操作

    原文:[转]C#内存操作 最近闲来无事发现周围的朋友都在玩<植物大战僵尸>的游戏!于是动了制作这游戏工具的念头!虽然在网上同类工具很多 但是用C#写的我几乎看不到!所以我想用C#写一个!  ...

  5. egret随笔-publish命令的改进

    缘由 导了几天的ipa,每次publish后都要改zip包名的代码,终于鼓起勇气翻看了一下egret publish的代码,唉,这代码...应该不会是北京的那几个大牛写的吧??? 正题 看了源码才知道 ...

  6. 动态规划——数字三角形(递归or递推or记忆化搜索)

    动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个 ...

  7. 关于cocos2dx 3.0升级崩溃报错(unable to load native library) 和(Fatal signal 11 (SIGSEGV) at 0x00000000)

    近期一直在Windows平台开发cocos-2dx游戏,期间做了一次引擎升级,升级到了3.0正式版本号.Windows平台上表现非常正常,没有出现什么问题. 上周五准备公布一个安卓包,编译非常轻松的就 ...

  8. 利用freopen()函数和fc命令简化程序调试

    大家在参加ACM比赛或者参加c/c++实验技能竞赛的时候,如果遇到大量的输入和大量的输出时,调试起来很不方便.一来如果结果不正确的话,需要重复输入大量数据:二来如果大量输出的话,得仔细检查输出结果与正 ...

  9. bootstrap注意事项(五)表单

    1.基本实例 单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control类的 <input>.<textarea> 和 <select> 元素都 ...

  10. SQL Server数据库---》基础

    SQL Server:只是操作数据库的一个工具(这种工具,只是提供一个界面化的方式让用户方便操作数据库) 开启服务:点击:我的电脑(计算机)--管理--服务和应用程序--服务--开启SQL Serve ...