cqlsh 和 Python cassandra driver 中最大时间 uuid 的差异

Differences for max time uuid in cqlsh and Python cassandra driver

我有一个错误,我的 python 代码无法在 Cassandra 中找到记录,这似乎归结为 cqlsh 中的 minTimeuuid/maxTimeuuid 函数与 [=26] 中的差异=] driver.

当我运行在cqlsh中查询时(ts列是TimeUUID):

cqlsh:mydb> SELECT minTimeuuid(unixTimestampOf(ts)), maxTimeuuid(unixTimestampOf(ts)), unixTimestampOf(ts), dateOf(ts) from mytable where ...;

 minTimeuuid(unixTimestampOf(ts))     | maxTimeuuid(unixTimestampOf(ts))     | unixTimestampOf(ts) | dateOf(ts)
--------------------------------------+--------------------------------------+---------------------
 177dc170-b8e3-11e1-8080-808080808080 | 177de87f-b8e3-11e1-7f7f-7f7f7f7f7f7f |       1339982128903 | 2012-06-18 03:15:28+0200

当我 运行 在 Python 中做同样的事情时:

Python 2.7.12 (default, Oct  8 2019, 14:14:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cassandra.util
>>> from datetime import datetime
>>> dt = datetime(2012,6,18,1,15,28,903000)
>>> cassandra.util.max_uuid_from_time(dt)
UUID('177dc170-b8e3-11e1-bf7f-7f7f7f7f7f7f')
>>> cassandra.util.min_uuid_from_time(dt)
UUID('177dc170-b8e3-11e1-8080-808080808080')

请注意,最小版本相同,但最大时间 uuid 不同:

Min (cqlsh first):                    |  Max (cqlsh first):
177dc170-b8e3-11e1-8080-808080808080  |  177de87f-b8e3-11e1-7f7f-7f7f7f7f7f7f
177dc170-b8e3-11e1-8080-808080808080  |  177dc170-b8e3-11e1-bf7f-7f7f7f7f7f7f

我不明白它们有什么不同,有什么想法吗?我在 Python 3.5.2 而不是上面的 2.7 下尝试了同样的事情,结果相同。

Cassandra timeuuid 比较使用(带符号的)8 位整数比较 UUID 的最低有效位。最高有效位使用内存顺序(unsigned int 比较)。因此 min/maxTimeuuid 函数创建一个 UUID,根据 Cassandra 比较顺序,该 UUID 将是 smallest/largest。

我的猜测是,编写原始代码的人不知道有符号字节和无符号字节比较之间的区别,然后必须遵守遗留顺序,以避免破坏任何现有数据。

您可以查看此提交以了解更多详细信息: https://github.com/apache/cassandra/commit/6d266253a5bdaf3a25eef14e54deb56aba9b2944