zoukankan      html  css  js  c++  java
  • 一致性哈希目标节点的计算验证逻辑

    https://www.cnblogs.com/zhjh256/p/6634138.html介绍了一致性哈希的原理,本文进一步附加如何计算的问题。

    附:一致性哈希计算目标节点的公式(之前为了满足测试要求可验证整理)

    设:

    1、物理节点数从1-10,通过dyn.spring.shardingDataSourceStart和dyn.spring.shardingDataSourceEnd设置。

    2、每个物理节点关联100个虚拟节点(内部实现约定),共1000个虚拟节点。

    3、哈希算法为FNV 32位散列函数(内部实现约定),返回正整型。

    //FNV1_32_HASH算法
    @Override
    public Integer hash(String key) {
     
        final int p = 16777619;
        int hash = (int)2166136261L;
        for (int i = 0; i < key.length(); i++)
            hash = (hash ^ key.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;
    }

    4、以物理节点为外层循环、虚拟节点数为内层循环,计算出虚拟节点和物理节点的有序映射关系Map<虚拟节点id,物理节点id>,虚拟节点的key为:哈希("分片节点数据源.name"-"其相对位置(从1开始)"+虚拟节点编号)。

    哈希值计算:

    1、应用哈希算法到key,得到hashValue;

    2、如果映射关系Map<虚拟节点id,物理节点id>中包含hashValue,返回物理节点;

    3、如果映射关系Map<虚拟节点id,物理节点id>中不包含hashValue,则:

         a. 返回虚拟节点id大于hashValue的子视图tailMap;

         b. 如果子视图tailMap不为空,则返回第一个大于hashValue的虚拟节点;否则映射到Map<虚拟节点id,物理节点id>的第一个虚拟节点;

         c. 根据b的结果,返回物理节点。

     不少文章提到了一致性哈希在java中的实现treemap,可全文没见键treemap,不知道如何蹭的。

  • 相关阅读:
    作业第十六周
    web、app、小程序测试异同点
    接口测试用例演进
    Python中“if __name__=='__main__':”
    iPhone发布内测程序的方法
    我的2020
    python 参数笔记 --> 位置参数 关键字参数 命名参数 形式参数 默认参数 可变参数 可选参数 位置顺序
    uwsgi 热部署 热启动 热更新
    Supervisor 进程管理工具 笔记
    spring Boot----注解驱动开发
  • 原文地址:https://www.cnblogs.com/zhjh256/p/12540532.html
Copyright © 2011-2022 走看看