Java 从Unix时间戳生成用于Cassandra的随机类型1 UUID

Java 从Unix时间戳生成用于Cassandra的随机类型1 UUID,java,scala,cassandra,uuid,Java,Scala,Cassandra,Uuid,是否可以从特定的Unix时间戳生成Scala/Java中的类型1 UUID(用于Cassandra),以便可以使用它从表中获取记录的范围片和单个记录。下面的结果似乎表明这是可能的 import com.datastax.driver.core.utils._ var td = new DateTime(2003,1,1,0,0) val time_millis = td.getMillis() val lower = UUIDs.startOf(time_millis) val upper

是否可以从特定的Unix时间戳生成Scala/Java中的类型1 UUID(用于Cassandra),以便可以使用它从表中获取记录的范围片和单个记录。下面的结果似乎表明这是可能的

import com.datastax.driver.core.utils._

var td = new DateTime(2003,1,1,0,0)
val time_millis = td.getMillis()
val lower =  UUIDs.startOf(time_millis)
val upper =  UUIDs.endOf(time_millis)

println(lower.getLeastSignificantBits())  #  9187201950435737472
println(lower.getMostSignificantBits())   # -545498504376938025
println(upper.getLeastSignificantBits())  # -9187201950435737471
println(upper.getMostSignificantBits())   # -545455558998945321
背景(以防有更好的方法解决问题)

我想批量将数千条车辆记录导入到Cassandra数据库中。“包含日期”列包含将车辆添加到原始数据库(VCA)的日期,并且在特定日期添加的车辆通常不超过几百辆,这似乎表明时间UUID中可用的熵可能足以解决此问题;即mac地址、小时、秒、…、100纳秒和随机部分

我需要执行的示例查询

SELECT * FROM vehicles WHERE manufacturer = 'BMW';
SELECT * FROM vehicles WHERE manufacturer = 'BMW' AND id = a8bb5800-694c-11d7-8080-808080808080;
SELECT * FROM vehicles WHERE manufacturer = 'BMW' AND id < a8bb5800-694c-11d7-8080-808080808080 AND id >= cb59c000-1c26-11d6-8080-808080808080;
配套制造商表

SELECT * from manufacturers;

CREATE TABLE manufacturers (
  id                 uuid,
  manufacturer       text,
  years              set<int>
  PRIMARY KEY (manufacturer, id)
);
从制造商处选择*;
创建表格制造商(
id uuid,
制造商文本,
设定年份
主键(制造商,id)
);

我想这在理论上是可能的。但是,没有标准的JavaAPI允许您在生成UUID时指定“当前时间”

这不是打算如何使用类型1 UUID。(尽管Cassandra能够根据时间选择“timeuuid”值!)嵌入式时间戳是保证唯一性方案的一部分。。。没别的了。如果您开始人为地生成类型1 UUID的时间与当前时间不同,那么(理论上)您就有一个问题,即您的“新”UUID实际上可能与在该机器上以及当时真正创建的UUID相同;i、 e.您的UUID不再是唯一的

如果我这样做,我将以正常方式生成UUID,并将时间戳存储在单独的字段中


更新


您可能能够调整“”来做您想做的事情。(提示:编写一个棘手的“时间戳同步器”)。但我仍然认为这是个坏主意。

我想理论上是有可能做到的。但是,没有标准的JavaAPI允许您在生成UUID时指定“当前时间”

这不是打算如何使用类型1 UUID。(尽管Cassandra能够根据时间选择“timeuuid”值!)嵌入式时间戳是保证唯一性方案的一部分。。。没别的了。如果您开始人为地生成类型1 UUID的时间与当前时间不同,那么(理论上)您就有一个问题,即您的“新”UUID实际上可能与在该机器上以及当时真正创建的UUID相同;i、 e.您的UUID不再是唯一的

如果我这样做,我将以正常方式生成UUID,并将时间戳存储在单独的字段中


更新


您可能能够调整“”来做您想做的事情。(提示:编写一个棘手的“时间戳同步器”)。但我仍然认为这是个坏主意。

我想理论上是有可能做到的。但是,没有标准的JavaAPI允许您在生成UUID时指定“当前时间”

这不是打算如何使用类型1 UUID。(尽管Cassandra能够根据时间选择“timeuuid”值!)嵌入式时间戳是保证唯一性方案的一部分。。。没别的了。如果您开始人为地生成类型1 UUID的时间与当前时间不同,那么(理论上)您就有一个问题,即您的“新”UUID实际上可能与在该机器上以及当时真正创建的UUID相同;i、 e.您的UUID不再是唯一的

如果我这样做,我将以正常方式生成UUID,并将时间戳存储在单独的字段中


更新


您可能能够调整“”来做您想做的事情。(提示:编写一个棘手的“时间戳同步器”)。但我仍然认为这是个坏主意。

我想理论上是有可能做到的。但是,没有标准的JavaAPI允许您在生成UUID时指定“当前时间”

这不是打算如何使用类型1 UUID。(尽管Cassandra能够根据时间选择“timeuuid”值!)嵌入式时间戳是保证唯一性方案的一部分。。。没别的了。如果您开始人为地生成类型1 UUID的时间与当前时间不同,那么(理论上)您就有一个问题,即您的“新”UUID实际上可能与在该机器上以及当时真正创建的UUID相同;i、 e.您的UUID不再是唯一的

如果我这样做,我将以正常方式生成UUID,并将时间戳存储在单独的字段中


更新


您可能能够调整“”来做您想做的事情。(提示:编写一个棘手的“时间戳同步器”)。但我仍然认为这是个坏主意。

谢谢@stephen。最后,我按照您的建议使用了一个时间戳和一个类型4 UUID,并创建了一个按id索引的新查找表,以查找参数(制造商、包含的日期等),从id查询主表。鉴于导入将是批处理操作,重复/多个真实来源不应该是太大的问题,我相信这是惯用的,因为在Cassandra的关系建模中使用了类似的策略。我完全同意从UUID中提取日期时间是对UUID目的的滥用。这种“聪明”往往会带来麻烦。但是,如果您坚持这样做,至少要检查它是否确实包含日期和时间。所有版本都有128位,可以相互替换,所以不要假设UUID是版本1。谢谢@stephen。我最终按照您的建议使用了一个时间戳和一个类型4 UUID,并创建了一个
SELECT * from manufacturers;

CREATE TABLE manufacturers (
  id                 uuid,
  manufacturer       text,
  years              set<int>
  PRIMARY KEY (manufacturer, id)
);