0

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

斯坦福大学 CH 理论

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

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

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

4

2 回答 2

1

Redisson使用分片highwayhashMap 和 Set 对象的算法。该算法具有较好的分布特性。

这是一个带有参考实现的使用示例:

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);
于 2017-07-19T11:59:29.553 回答
1

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

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

于 2017-07-17T22:14:23.010 回答