用Java实现一致性哈希算法

用Java实现一致性哈希算法,java,redis,consistent-hashing,Java,Redis,Consistent Hashing,我正试图用java实现一个一致的基于散列的算法,使用以下参考来将密钥分片到redis- 我试图理解为节点和键生成hascode的最佳方法。目前,我正在使用DigestUtils生成哈希,如下所示& 将返回值添加到环/圆- private BigInteger hash(String key) { return new BigInteger(DigestUtils.md5Hex(key.getBytes()), 16); } 我想知道这种方法听起来是否正确。如果您查看Memcache的

我正试图用java实现一个一致的基于散列的算法,使用以下参考来将密钥分片到redis-

我试图理解为节点和键生成hascode的最佳方法。目前,我正在使用DigestUtils生成哈希,如下所示& 将返回值添加到环/圆-

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

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

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


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

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

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

使用
highwayhash
算法来分割地图和集合对象。该算法具有较好的分布特性

以下是一个参考使用示例:

使用
highwayhash
算法分割贴图和设置对象。该算法具有较好的分布特性

以下是一个参考使用示例:

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);