具有复合键的Cassandra哈希算法

时间:2014-11-30 11:38:32

标签: algorithm hash cassandra murmurhash

我试图了解Cassandra使用什么算法来生成复合分区键的murmur3哈希值。我知道我可以直接从CQL获取值,但我想直接从Java / scala代码重现任何给定元组的Cassandra行为。

对于简单的分区键,以下函数计算正确的值(至少在很多情况下,我知道通过查看源代码并不准确):

long l = com.google.common.hash.Hashing.Hashing.murmur3_128()。hashString(" my-string",Charset.forName(" UTF-8") ).asLong();

如果分区键上有两列,该怎么办?

两个字符串串联的哈希值不一样。

1 个答案:

答案 0 :(得分:4)

感谢您提供有关该算法的更多详细信息。我写了一个示例代码,以便分享解决方案。

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