一致性hash算法java版本简单实现

package com.java4all.grouth.consistent;

import java.util.LinkedList;

import java.util.List;

import java.util.SortedMap;

import java.util.TreeMap;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

* 一致性hash算法java简易实现

* @author IT云清

* 参考:https://blog.csdn.net/zhanglu0223/article/details/100579254

*/

public class ConsistentHash {

private static final Logger LOGGER = LoggerFactory.getLogger(ConsistentHash.class);

/**

* 虚拟节点个数

* 每个真实节点对应的虚拟节点个数

*/

private static final int VIRTUAL_NUM = 5;

/**

* 虚拟节点

* eg:<656715414,192.168.1.1&&VN3>

* 真实节点数量一般偏少,引入虚拟节点来平衡

* 每个真实节点对应多个虚拟节点,这样每个节点尽可能在hash环上均匀分布,可以根据虚拟节点找到真实节点

*/

private static SortedMap shards = new TreeMap<>();

/**

* 真实节点

*/

private static List realNodes = new LinkedList<>();

/**

* 模拟初始节点

*/

private static String[] servers = {"116.116.1.1", "116.116.1.2", "116.116.1.3", "116.116.1.5", "116.116.1.6"};

/**

* 初始化虚拟节点

*/

static {

for (String server : servers) {

realNodes.add(server);

LOGGER.info("添加真实节点{}",server);

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

String virtualNode = server + "&&VN" + i;

int hash = getHash(virtualNode);

shards.put(hash,virtualNode);

LOGGER.info("添加虚拟节点{},hash为{}",virtualNode,hash);

}

}

}

public static void main(String[]args){

test2();

}

public static void test2(){

//测试定位node

LOGGER.info(getSever("aa"));

LOGGER.info(getSever("涨三"));

LOGGER.info(getSever("num_19120000"));

LOGGER.info(getSever("num_19120000"));

LOGGER.info("------------------");

//测试添加节点

addNode("192.192.116.1");

addNode("192.192.116.2");

LOGGER.info("------------------");

//测试删除节点

delNode("116.116.1.1");

}

/**

* 获取真实节点ip

* @param str 字符串

* @return

*/

public static String getSever(String str){

//计算hash

int hash = getHash(str);

Integer key = null;

//寻找最近的虚拟node

SortedMap tailMap = shards.tailMap(hash);

//获取在hash环上 右侧最近的虚拟节点的key

key = tailMap.isEmpty() ? shards.lastKey() : tailMap.firstKey();

//根据hash获取虚拟节点

String virtualNode = shards.get(key);

//返回虚拟节点的真实ip

return virtualNode.substring(0,virtualNode.indexOf("&&"));

}

/**

* 添加节点

* @param node

*/

public static void addNode(String node){

if(!realNodes.contains(node)){

realNodes.add(node);

LOGGER.info("新增真实节点上线,{}",node);

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

String virtualNode = node + "&&VN" + i;

int hash = getHash(virtualNode);

shards.put(hash,virtualNode);

LOGGER.info("新增虚拟节点{},hash为{}",virtualNode,hash);

}

}

}

/**

* 删除节点

* @param node

*/

public static void delNode(String node){

if(realNodes.contains(node)){

//下线真实节点

realNodes.remove(node);

LOGGER.info("真实节点下线,{}",node);

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

String virtualNode = node + "&&VN" + i;

int hash = getHash(virtualNode);

//移除虚拟节点

shards.remove(hash);

LOGGER.info("下线虚拟节点{},hash为{}",virtualNode,hash);

}

}

}

/**

* FNV1_32_HASH算法

* @param str 任意字符串

* @return 返回int类型的hash值

*/

private static int getHash(String str) {

final int p = 16777619;

int hash = (int) 2166136261L;

for (int i = 0; i < str.length(); i++) {

hash = (hash ^ str.charAt(i)) * p;

}

hash += hash << 13;

hash ^= hash >> 7;

hash += hash << 3;

hash ^= hash >> 17;

hash += hash << 5;

// 如果算出来的值为负数则取其绝对值

if (hash < 0) {

hash = Math.abs(hash);

}

return hash;

}

}

代码一致性 java_java实现一致性hash算法实例代码相关推荐

  1. 计算1至1000间的合数c语言,输出1000以内的素数的算法(实例代码)

    输出1000以内的素数的算法(实例代码) 代码如下所示: 复制代码 代码如下: #include "stdafx.h" #include #include bool IsSushu ...

  2. 聚类算法-最大最小距离算法(实例+代码)

    聚类算法-最大最小距离算法(实例+代码) [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53708042 目录 聚类算法- ...

  3. 异或加密的java算法_Java使用异或运算实现简单的加密解密算法实例代码

    Java简单的加密解密算法,使用异或运算 实例1: package cn.std.util; import java.nio.charset.Charset; public class DeEnCod ...

  4. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  5. 中文分词算法python代码_python实现中文分词FMM算法实例

    本文实例讲述了python实现中文分词FMM算法.分享给大家供大家参考.具体分析如下: FMM算法的最简单思想是使用贪心算法向前找n个,如果这n个组成的词在词典中出现,就ok,如果没有出现,那么找n- ...

  6. 人工神经网络算法实例代码,人工神经网络算法步骤

    神经网络算法实例说明有哪些? 在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能.构作专家系统.制成机器人.复杂系统控制等等. 纵观当代新兴科学技 ...

  7. python堆排序算法代码_python堆排序算法实例代码

    python 实现堆排序算法代码,需要的朋友可以参考下 代码如下:#!/usr/bin/python import sys def left_child(node): return node * 2 ...

  8. python简单代码编写-python读写Excel表格的实例代码(简单实用)

    安装两个库:pip install xlrd.pip install xlwt 1.python读excel――xlrd 2.python写excel――xlwt 1.读excel数据,包括日期等数据 ...

  9. python读取txt文件代码-python批量处理txt文件的实例代码

    通过python对多个txt文件进行处理 读取路径,读取文件 获取文件名,路径名 对响应的文件夹名字进行排序 对txt文件内部的数据相应的某一列/某一行进行均值处理 写入到事先准备好的Excel文件中 ...

  10. python3爬虫实例代码-Python3爬虫带上cookie的实例代码

    Cookie的英文原意是"点心",它是在客户端访问Web服务器时,服务器在客户端硬盘上存放的信息,好像是服务器发送给客户的"点心".服务器可以根据Cookie来 ...

最新文章

  1. servlet必知细节(一)
  2. mysql 存储guid_我应该如何在MySQL表中存储GUID?
  3. 【css】怎么让Chrome支持小于12px 的文字
  4. 深度学习核心技术精讲100篇(六十三)-【CNN】一文详细讲解前因后果
  5. Linux 技巧: Bash 测试和比较函数
  6. python-字符串的格式化输出format
  7. Java初学者不可不知道知识点
  8. 但是在公司开空调睡觉还是冷
  9. 对于.net开发的程序谷歌输入法输入优于搜狗
  10. 倒数15日开幕!第八届全球云计算大会解锁主论坛重磅嘉宾
  11. 含并行连结的网络(GoogLeNet)
  12. java百元买百兔 穷举法_JAVA--算法与数据结构- 逢7过百钱白鸡不死神兔【1/100】...
  13. jcyzoj1505: 原地tp
  14. Rocksdb prefix Bloomfilter
  15. ipad上html语言编辑,在 iPad 上键入和编辑文本的小技巧
  16. IDEA使用单元测试对数据库的insert语句进行测试,出现添加多条问题的解决方案
  17. (83)Part21-阿里云VOD-03-视频播放测试
  18. 图论及其应用 学习笔记(一)图的基本概念
  19. windows命令----netstat命令
  20. win7 (win 10) 新建文件夹的 快捷键

热门文章

  1. Session 的几种存储方式及优缺点
  2. Zabbix Server安装部署
  3. 30. SELinux
  4. 24.磁盘配额(Quota)
  5. RabbitMQ实战:理解消息通信
  6. [BZOJ 5074]小B的数字
  7. HDU1251 统计难题 trie树
  8. eclipse——配置maven插件
  9. 判断当前是什么版本浏览器
  10. PHP 后台程序配置config文件,及form表单上传文件