一个简单的一致性哈希算法实现(Java版本)
2016-08-23 10:21
316 查看
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 stub nodes = 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 stub ByteBuffer 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; } }
相关文章推荐
- 一个简单的用JAVA实现的屏幕抓图(源代码)
- 一个简单的Echo Server的Java实现(增强版)
- 一个用Java实现的简单的最大堆
- JAVA SPRING MVC 实现一个简单的页面显示功能
- 一个简单词法分析器的实现代码(java实现)
- 一个简单的冒泡排序和快速排序算法java实现
- 利用java实现一个简单的远程监控程序
- JAVA进阶:一个简单Thread缓冲池的实现
- 超简单实现一个只接收数字的类[JAVA]
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- 一个简单的用JAVA实现的屏幕抓图(源代码)
- Java进阶:一个简单Thread缓冲池的实现
- 用RMI实现一个简单的实时聊天系统(java语言)
- Java 一个简单Hashtable的实现
- 一个java实现的简单日历,采用左树右列表的方式实现,具有参考意义
- 用java实现一个简单的序列化的例子
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- Java实现一个简单的定时器
- 一个简单词法分析器的实现代码(java实现)
- 一个简单的线程池实现(java版)