用Java实现一致的哈希算法

时间:2017-07-17 21:07:38

标签: java redis consistent-hashing

我正在尝试在java中使用以下参考实现一致的基于哈希的算法,以便将密钥分片到redis -

Stanford Theory on CH

我正在尝试了解为节点和密钥生成hascode的最佳方法。目前我使用DigestUtils生成哈希如下& 将返回的值添加到ring / circle -

private BigInteger hash(String key) {
    return new BigInteger(DigestUtils.md5Hex(key.getBytes()), 16);
}

我想知道这种方法听起来是否正确。

2 个答案:

答案 0 :(得分:1)

如果查看Memcache的源代码spymemcached client,您可以看到该客户端如何实现Ketama一致性散列算法。关注以下文件:

虽然不是专门针对Redis,但原则是相同的。

答案 1 :(得分:1)

Redisson使用highwayhash算法进行分片Map和Set对象。该算法具有更好的分布特性。

以下是参考implementation的使用示例:

long[] KEY = {0x9e3779b97f4a7c15L, 0xf39cc0605cedc834L, 0x1082276bf3a27251L, 0xf86c6a11d0c18e95L};

byte[] data = new byte[] {1, 2, 3, 4, 5};

// getting 128 bits hashing
long[] hash128 = HighwayHash.hash128(data, 0, data.length, key);
// getting 256 bits hashing
long[] hash256 = HighwayHash.hash256(data, 0, data.length, key);