Cassandra令牌函数背后的算法是什么?

brc7rcf0  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(400)

我的驱动程序中的token函数不支持复合分区键,但它可以很好地与单个分区键配合使用,它将8位形式的二进制作为输入,并将其传递给murru3哈希函数,然后从murru3的结果中提取64个有符号小整数(token),并忽略任何额外的二进制缓冲区。
所以我希望为一个复合分区键生成二进制,然后像往常一样把它传递给3,一个算法或按位操作将非常有用,或者至少是任何编程语言的一个源代码。
我不是说第三部分,只是令牌端,它转换/混合复合分区键并以二进制形式输出原始字节。

sg24os4d

sg24os4d1#

看看驱动程序,因为它们已经生成了令牌来找到正确的协调器。https://github.com/datastax/java-driver/blob/8be7570a3c7fbba773ae2581bbf26e8196e7d6fb/driver-core/src/main/java/com/datastax/driver/core/token.java#l112
它与典型的burring3稍有不同,因为它在创建时有一个bug,并且无法在不破坏现有集群的情况下更改它。因此,我建议从他们那里复制它,或者更好的是,使用现有的驱动程序来查找令牌。

aor9mmx1

aor9mmx12#

最后我找到了一个解决问题的方法:计算复合分区密钥的令牌的算法:primary_key((text,int))->因此分区密钥是复合分区密钥(text,int)。
示例:具有复合\u分区\u键的行('hello',1)
应用算法:
1-在big endian(16位)表示中布局复合分区键的组件:
第一个组件='你好'->68 65 6c 6c 6f
秒组件=1->00 01
68 65 6c 6c 6f 00 00 01
2-在每个组件之前添加组件的两个字节长度
第一个组件='你好',长度=5->00 05 68 65 6c 6c 6f
秒分量=1,因此长度=4->00 04 00 01
00 05 68 65 6c 6c 6f 00 04 00 01
3-在每个组件后添加零值
第一个组件='你好'->00 05 68 65 6c 6c 6f 00
秒组件=1->00 04 00 00 01 00
4-结果
00 05 68 65 6c 6c 6f 0000 04 00 00 01 00
现在将结果作为您的murrit3函数所理解的二进制基传递(确保它是cassandra变量)。

相关问题