我希望实现我的ConsistentHashing,我可以提供一个好的HashingFunction。这里解释了使用SortedMap的体面实现:https://weblogs.java.net/blog/tomwhite/archive/2007/11/consistent_hash.html
现在像帖子上建议的那样我想使用像MD5这样具有良好随机性的加密函数。我知道MD5会返回一个固有的128位输出,但我需要一个随机的32位。以下会有很高的基数吗?
(1)MD5输出的前4个字节是否足够随机?在这种情况下,我可以采用128位MD5哈希的前32位:
class MD5Hashing implements HashFunction{
@Override
public int getHash(String key) throws Exception{
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] byteArray = digest.digest(key.getBytes("UTF-8"));
ByteBuffer buffer = ByteBuffer.wrap(byteArray);
return buffer.getInt()& 0x7fffffff;
}
}
(2)如果我只使用String的内部Horner算法,该算法在String中的所有字符上使用31x + y,该怎么办?
class StringHashing implements HashFunction{
@Override
public int getHash(String key) throws Exception{
return key.hashCode()& 0x7fffffff;
}
}
(3)我的内部Consistent Hashing就像在上面的链接中只是一个TreeMap我应该使用BigInteger来代替仍然能够从MD5或其他Crypto算法获得所有128位吗?
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
编辑: 看起来两者都很糟糕,我甚至尝试从MD5哈希中获取最后4个字节。 buffer.getInt(12)。
随后运行5000个随机字符串是分发。 {host4.a.b.com = 1599,host3.a.b.com = 1075,host2.a.b.com = 238,host1.a.b.com = 2088}
答案 0 :(得分:0)
找到Murmur哈希,它有API将String输入转换为32位哈希输出。给我一个非常好的发行。
{host4.a.b.com = 1665,host3.a.b.com = 1373,host2.a.b.com = 648,host1.a.b.com = 1314}
http://d3s.mff.cuni.cz/~holub/sw/javamurmurhash/
public static int hash32( final String text) {...}