一个简单的一致性哈希算法实现(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