一个简单的一致性哈希算法实现(Java版本)
来源:互联网 发布:linux socket调试工具 编辑:程序博客网 时间:2024/06/05 04:45
import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.util.List;import java.util.SortedMap;import java.util.TreeMap;/** * 一致性哈希算法 * @author Administrator * * @param <S> */public class Shard<S> {private TreeMap<Long, S> nodes; //虚拟节点private List<S> shards;//真实机器节点private final int NODE_NUM = 100; //每个机器节点对应的虚拟节点数public Shard(List<S> shards){super();this.shards = shards;init();}private void init() { //初始化一致性哈希环// TODO Auto-generated method stubnodes = new TreeMap<Long, S>();for(int i =0; i != shards.size(); ++i){ //每个真实机器节点都需要关联虚拟节点final S shardinfo = shards.get(i);for(int n = 0; n<NODE_NUM; n++){//一个真实的机器节点关联的NODE_NUM个虚拟节点nodes.put(hash("SHARD-"+ i + "-NODE-"+n), shardinfo);}}}public S getShardInfo(String key){SortedMap<Long, S> tail = nodes.tailMap(hash(key));//沿着环的顺时针找到一个虚拟节点if(tail.size() == 0){return nodes.get(nodes.firstKey());}return tail.get(tail.firstKey());}/** * MurMurHash算法,是非加密的HASH算法,性能很高 * 算法碰撞率低 * @param string * @return */@SuppressWarnings("static-access")private Long hash(String key) {// TODO Auto-generated method stubByteBuffer buf = ByteBuffer.wrap(key.getBytes());int seed = 0x1234ABCD;ByteOrder byteorder = buf.order();buf.order(byteorder.LITTLE_ENDIAN);long m = 0xc6a4a7935bd1e995L;int r= 47;long h = seed^(buf.remaining()*m);long k;while(buf.remaining() > 0){k= buf.getLong();k *= m;k ^=k>>>r;k *= m;h ^= k;h *= m;}if (buf.remaining() >0){ByteBuffer finish = ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN);finish.put(buf).rewind();h^= finish.getLong();h*=m;}h ^= h>>>r;h *= m;h ^= h>>>r;buf.order(byteorder);return h;}}
0 0
- 一个简单的一致性哈希算法实现(Java版本)
- java简单实现一致性哈希算法
- 一致性哈希算法的Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与Java实现
- 一致性哈希算法与java实现
- 一致性哈希算法与Java实现
- springmvc彻底解决中文乱码问题
- 80. Remove Duplicates from Sorted Array II
- 树形DP整理小结
- 使用navigator.userAgent.toLowerCase()判断登陆端是pc还是手机
- 如何画分割线
- 一个简单的一致性哈希算法实现(Java版本)
- React 数据流管理架构之Redux介绍
- Android开发中如何把多个JSONArray组合(拼接)在一起,组成一个整体的字符串。
- 开机自动打开、连接Miracast
- (四十)、内部类
- 剑指Offer_42_和为S的两个数字
- eclipse的基本配置
- android app架构设计mvc
- x.utiles的使用介绍