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

What is the algorithm behind Cassandra's token function?

我的驱动程序中的 Token 函数不支持复合分区键,但它与单个分区键配合得很好,它采用 8 位形式的二进制作为输入并将其传递给 murmur3 哈希函数,并且从 murmur3 的结果中提取 64 位有符号小整数(令牌)并忽略任何额外的二进制缓冲区。

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

我指的不是 murmur3 部分,而是 converts/mixes 复合分区键并以二进制形式输出原始字节的令牌端。

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

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

最后我找到了问题的解决方案:计算复合分区键令牌的算法: 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 变体)。