从Unix时间戳生成随机类型1 UUID以与Cassandra一起使用

时间:2014-09-03 22:19:05

标签: java scala cassandra uuid

是否可以从特定的Unix时间戳生成Scala / Java中的Type 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)的日期,并且通常在特定日期添加的数量不超过几百,这似乎表明在timeuuid中可用的熵可能足以解决此问题;即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;

CQL中的表模式。

CREATE TABLE vehicles (
  id                 timeuuid,
  manufacturer       text,
  model              text,
  transmission       text,
  description        text,
  engine_capacity    double,
  fuel_type          text,
  metric_urban       double,
  metric_extra_urban double,
  metric_combined    double,
  co2_g_per_km       double,
  euro_standard      int,
  noise              double,
  co                 double,
  hc_nox             double,
  hc                 double,
  nox                double,
  particulates       double,
  date_included      timestamp,
  PRIMARY KEY (manufacturer, id)
) WITH CLUSTERING ORDER BY (id ASC);

配套制造商表

SELECT * from manufacturers;

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

1 个答案:

答案 0 :(得分:3)

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

这不是如何使用类型1 UUID的方式。 (不能承受Cassandra根据时间选择“timeuuid”值的能力!)嵌入式时间戳是保证唯一性的方案的一部分......仅此而已。如果您开始人工生成类型1 UUID的时间与当前时间不同,则会产生(理论上)问题,即您的“新”UUID实际上可能与在该计算机上真正创建的UUID相同;即你的UUID不再是唯一的。

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


<强>更新

您可以调整“https://github.com/cowtowncoder/java-uuid-generator”来做您想做的事情。 (提示:写一个棘手的“时间戳同步器”)。但我仍然认为这是一个坏主意。