Cassandra的令牌功能背后的算法是什么?

时间:2018-09-29 00:49:53

标签: algorithm cassandra token partition murmurhash

我的驱动程序中的Token函数不支持复合分区键,但是它与单个分区键配合得很好,它以8位形式的二进制作为输入并将其传递给murmur3散列函数并提取murmur3的结果中的64-signed-little-integer(令牌),并且忽略任何额外的二进制缓冲区。

所以我的希望是为复合分区键生成二进制文件,然后像往常一样将其传递给murmur3,算法或按位运算将非常有帮助,或者至少是任何编程语言的源代码。

我不是说murmur3部分,只是令牌端,它转换/混合复合分区键并以二进制形式输出原始字节。

2 个答案:

答案 0 :(得分:0)

看一下驱动程序,因为它们已经生成了令牌以找到正确的协调器。 https://github.com/datastax/java-driver/blob/8be7570a3c7fbba773ae2581bbf26e8196e7d6fb/driver-core/src/main/java/com/datastax/driver/core/Token.java#L112

它与典型的murmur3略有不同,这是由于制作时存在错误以及无法在不破坏现有群集的情况下进行更改。因此,我建议从他们那里复制它或者更好的方法是,使用现有的驱动程序来查找令牌。

答案 1 :(得分:0)

最后,我找到了一个问题的解决方案:用于计算复合分区键令牌的算法: Primary_key((text,int))->因此,分区键是一个Composite_partition_key(text,int)。

示例:一行包含Composite_partition_key('hello',1)

应用算法:

1-在big-endian(16位)表示中布置复合分区键的组成部分:

first_component ='hello'-> 68 65 6c 6c 6f

sec_component = 1-> 00 00 00 01

68 65 6c 6c 6f 00 00 00 01

2-在每个组件之前添加两个字节的长度

first_component ='hello',长度= 5-> 00 05 68 65 6c 6c 6f

sec_component = 1,因此长度= 4-> 00 04 00 00 00 01

00 05 68 65 6c 6c 6f 00 04 00 00 00 01

3-在每个组件后添加零值

first_component ='hello'-> 00 05 68 65 6c 6c 6f 00

sec_component = 1-> 00 04 00 00 00 01 00

4个结果

00 05 68 65 6c 6c 6f 00 00 04 00 00 00 01 00

现在将结果作为murmur3函数可以理解的二进制基础(确保它是cassandra变体)传递。