Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 393|回复: 0

[Java基础知识]一致性Hash算法(Java实现)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-9-30 17:41:29 | 显示全部楼层 |阅读模式
    代码实现了一致性Hash算法,并加入虚拟节点。
    1. package com.baijob.commonTools;
    2. import java.util.Collection;
    3. import java.util.SortedMap;
    4. import java.util.TreeMap;
    5. /**
    6. * 一致性Hash算法
    7. * 算法详解:http://blog.csdn.net/sparkliang/article/details/5279393
    8. * 算法实现:https://weblogs.java.net/blog/2007/11/27/consistent-hashing
    9. * @author xiaoleilu
    10. *
    11. * @param
    12.    
    13.              节点类型
    14. */
    15. public class ConsistentHash
    16.      
    17.        {
    18.         /** Hash计算对象,用于自定义hash算法 */
    19.         HashFunc hashFunc;
    20.         /** 复制的节点个数 */
    21.         private final int numberOfReplicas;
    22.         /** 一致性Hash环 */
    23.         private final SortedMap< Integer, T> circle = new TreeMap< Integer, T>();
    24.        
    25.         /**
    26.          * 构造,使用Java默认的Hash算法
    27.          * @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡
    28.          * @param nodes 节点对象
    29.          */
    30.         public ConsistentHash(int numberOfReplicas, Collection
    31.       
    32.         nodes) {
    33.                 this.numberOfReplicas = numberOfReplicas;
    34.                 this.hashFunc = new HashFunc() {
    35.                        
    36.                         @Override
    37.                         public Integer hash(Object key) {
    38.                                 String data = key.toString();
    39.                                 //默认使用FNV1hash算法
    40.                                 final int p = 16777619;
    41.                                 int hash = (int) 2166136261L;
    42.                                 for (int i = 0; i < data.length(); i++)
    43.                                         hash = (hash ^ data.charAt(i)) * p;
    44.                                 hash += hash << 13;
    45.                                 hash ^= hash >> 7;
    46.                                 hash += hash << 3;
    47.                                 hash ^= hash >> 17;
    48.                                 hash += hash << 5;
    49.                                 return hash;
    50.                         }
    51.                 };
    52.                 //初始化节点
    53.                 for (T node : nodes) {
    54.                         add(node);
    55.                 }
    56.         }
    57.         /**
    58.          * 构造
    59.          * @param hashFunc hash算法对象
    60.          * @param numberOfReplicas 复制的节点个数,增加每个节点的复制节点有利于负载均衡
    61.          * @param nodes 节点对象
    62.          */
    63.         public ConsistentHash(HashFunc hashFunc, int numberOfReplicas, Collection< T> nodes) {
    64.                 this.numberOfReplicas = numberOfReplicas;
    65.                 this.hashFunc = hashFunc;
    66.                 //初始化节点
    67.                 for (T node : nodes) {
    68.                         add(node);
    69.                 }
    70.         }
    71.         /**
    72.          * 增加节点
    73.       

    74.          * 每增加一个节点,就会在闭环上增加给定复制节点数
    75.       

    76.          * 例如复制节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node
    77.          * 由于hash算法会调用node的toString方法,故按照toString去重
    78.          * @param node 节点对象
    79.          */
    80.         public void add(T node) {
    81.                 for (int i = 0; i < numberOfReplicas; i++) {
    82.                         circle.put(hashFunc.hash(node.toString() + i), node);
    83.                 }
    84.         }
    85.         /**
    86.          * 移除节点的同时移除相应的虚拟节点
    87.          * @param node 节点对象
    88.          */
    89.         public void remove(T node) {
    90.                 for (int i = 0; i < numberOfReplicas; i++) {
    91.                         circle.remove(hashFunc.hash(node.toString() + i));
    92.                 }
    93.         }
    94.         /**
    95.          * 获得一个最近的顺时针节点
    96.          * @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点
    97.          * @return 节点对象
    98.          */
    99.         public T get(Object key) {
    100.                 if (circle.isEmpty()) {
    101.                         return null;
    102.                 }
    103.                 int hash = hashFunc.hash(key);
    104.                 if (!circle.containsKey(hash)) {
    105.                         SortedMap< Integer, T> tailMap = circle.tailMap(hash);        //返回此映射的部分视图,其键大于等于 hash
    106.                         hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
    107.                 }
    108.                 //正好命中
    109.                 return circle.get(hash);
    110.         }
    111.         /**
    112.          * Hash算法对象,用于自定义hash算法
    113.          * @author xiaoleilu
    114.          *
    115.          */
    116.         public interface HashFunc {
    117.                 public Integer hash(Object key);
    118.         }
    119. }
    120.       
    121.      
    122.    
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 18:06 , Processed in 0.368475 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表