MD5用于我的java哈希码,它是int 32位

时间:2015-01-26 13:28:07

标签: java hash

我希望实现我的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}

1 个答案:

答案 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) {...}