连续性 一致性hash算法(Consistent hashing)( 四 )


哈希算法实现,使用的是算法,是非加密的哈希算法速度比crc,md5更快
public final class MurmurHash {public MurmurHash() {}private byte[] toBytesWithoutEncoding(String str) {int len = str.length();int pos = 0;byte[] buf = new byte[len << 1];for (int i = 0; i < len; i++) {char c = str.charAt(i);buf[pos++] = (byte) (c & 0xFF);buf[pos++] = (byte) (c >> 8);}return buf;}public int hashcode(String str) {byte[] bytes = toBytesWithoutEncoding(str);return hash32(bytes, bytes.length);}/**** Generates 32 bit hash from byte array of the given length and* seed.*** @param data byte array to hash* @param length length of the array* to hash* @param seed initial seed value* @return 32 bit hash of the* given array*/public int hash32(final byte[] data, int length, int seed) {// 'm' and 'r' are mixing constants generated offline.// They're not really 'magic', they just happen to work well.final int m = 0x5bd1e995;final int r = 24;// Initialize the hash to a random valueint h = seed ^ length;int length4 = length / 4;for (int i = 0; i < length4; i++) {final int i4 = i * 4;int k = (data[i4 + 0] & 0xff) + ((data[i4 + 1] & 0xff) << 8)+ ((data[i4 + 2] & 0xff) << 16)+ ((data[i4 + 3] & 0xff) << 24);k *= m;k ^= k >>> r;k *= m;h *= m;h ^= k;}// Handle the last few bytes of the input arrayswitch (length % 4) {case 3:h ^= (data[(length & ~3) + 2] & 0xff) << 16;case 2:h ^= (data[(length & ~3) + 1] & 0xff) << 8;case 1:h ^= (data[length & ~3] & 0xff);h *= m;}h ^= h >>> 13;h *= m;h ^= h >>> 15;return h;}/**** Generates 32 bit hash from byte array with default seed value.** @param* data byte array to hash* @param length length of the array to hash* @return* 32 bit hash of the given array*/public int hash32(final byte[] data, int length) {return hash32(data, length, 0x9747b28c);}public int hash32(final String data) {byte[] bytes = toBytesWithoutEncoding(data);return hash32(bytes, bytes.length, 0x9747b28c);}/**** Generates 64 bit hash from byte array of the given length and seed.*** @param data byte array to hash* @param length length of the array to* hash* @param seed initial seed value* @return 64 bit hash of the* given array*/public long hash64(final byte[] data, int length, int seed) {final long m = 0xc6a4a7935bd1e995L;final int r = 47;long h = (seed & 0xffffffffl) ^ (length * m);int length8 = length / 8;for (int i = 0; i < length8; i++) {final int i8 = i * 8;long k = ((long) data[i8 + 0] & 0xff)+ (((long) data[i8 + 1] & 0xff) << 8)+ (((long) data[i8 + 2] & 0xff) << 16)+ (((long) data[i8 + 3] & 0xff) << 24)+ (((long) data[i8 + 4] & 0xff) << 32)+ (((long) data[i8 + 5] & 0xff) << 40)+ (((long) data[i8 + 6] & 0xff) << 48)+ (((long) data[i8 + 7] & 0xff) << 56);k *= m;k ^= k >>> r;k *= m;h ^= k;h *= m;}switch (length % 8) {case 7:h ^= (long) (data[(length & ~7) + 6] & 0xff) << 48;case 6:h ^= (long) (data[(length & ~7) + 5] & 0xff) << 40;case 5:h ^= (long) (data[(length & ~7) + 4] & 0xff) << 32;case 4:h ^= (long) (data[(length & ~7) + 3] & 0xff) << 24;case 3:h ^= (long) (data[(length & ~7) + 2] & 0xff) << 16;case 2:h ^= (long) (data[(length & ~7) + 1] & 0xff) << 8;case 1:h ^= (long) (data[length & ~7] & 0xff);h *= m;};h ^= h >>> r;h *= m;h ^= h >>> r;return h;}/**** Generates 64 bit hash from byte array with default seed value.** @param* data byte array to hash* @param length length of the array to hash* @return* 64 bit hash of the given string*/public long hash64(final byte[] data, int length) {return hash64(data, length, 0xe17a1465);}public long hash64(final String data) {byte[] bytes = toBytesWithoutEncoding(data);return hash64(bytes, bytes.length);}}
一致性哈希的实现
public class ConsistentHash {/*** 虚拟节点个数 用于复制真是节点进行负载均衡*/private final int virtualNodeNum;//环形SortMap 用于存放节点并排序private SortedMap circleMap = new TreeMap();/*** 构造,使用Java默认的Hash算法* @param virtualNodeNum 虚拟化节点数量 复制的节点个数,增加每个节点的复制节点有利于负载均衡* @param nodes 节点对象*/public ConsistentHash(int virtualNodeNum,Collection nodes){this.virtualNodeNum = virtualNodeNum;for(Node node:nodes){addNode(node);}}/*** 构造* @param virtualNodeNum 虚拟化节点数量 复制的节点个数,增加每个节点的复制节点有利于负载均衡* @param nodes 节点对象*/public ConsistentHash(int virtualNodeNum,Node node){this.virtualNodeNum = virtualNodeNum;addNode(node);}/*** 构造* @param virtualNodeNum 虚拟化节点数量* */public ConsistentHash(int virtualNodeNum){this.virtualNodeNum = virtualNodeNum;}/*** 增加节点