Cassandra哈希算法与复合键

3
我正试图理解Cassandra使用的算法来生成复合分区键的murmur3哈希值。我知道可以直接从CQL获取值,但我想要从Java/scala代码中直接重现Cassandra对于任何给定元组的行为。
对于简单的分区键,以下函数计算出正确的值(至少在许多情况下,通过查看源代码,我知道它并不精确): long l = com.google.common.hash.Hashing.murmur3_128().hashString("my-string", Charset.forName("UTF-8")).asLong();
如果我有两个列在分区键上呢?
连接两个字符串的哈希值不同。

可能是Murmur3哈希算法在Cassandra中的使用的重复问题。 - Aaron
跟随上面的链接,查看答案评论。 - Aaron
1个回答

6
感谢您提供有关算法的更多详细信息。我编写了一份样例代码,以便分享解决方案。
byte[] keyBytes;
try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(bos)) {    

    String[] keys = new String[] {"key1", "key2"};
    for(String key : keys) {
        byte[] arr = key.getBytes("UTF-8");
        out.writeShort(arr.length);
        out.write(arr, 0, arr.length);
        out.writeByte(0);
    }
    out.flush();
    keyBytes = bos.toByteArray();
}

long hash = Hashing.murmur3_128().hashBytes(keyBytes).asLong();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接