一致性哈希目标节点的计算验证逻辑
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,不知道如何蹭的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2017-03-22 java常用代码段整理(持续更新)