Как сгенерировать TimeUUID в Java/Scala

Кто-нибудь знает, как генерировать UUID на основе времени в Java/Scala?

Вот семейство столбцов:

CREATE table col(ts timeuuid)

Я использую Кассандру 1.2.4

Ценю твою помощь!

4 ответа

Решение

Кассандра имеет UUIDGen для создания Timeuuids. Источник для этого здесь:

https://github.com/apache/cassandra/blob/cassandra-2.1/src/java/org/apache/cassandra/utils/UUIDGen.java

Если вы используете драйверы Datastax, вы можете использовать служебный класс UUID для его генерации.

import com.datastax.driver.core.utils.UUIDs;
....
UUID timeBasedUuid = UUIDs.timeBased();

Я использую тот же способ для Cassandra Cli, и для имени столбца я использую

System.currentTimeMillis().toString

scala>     val timestamp = System.currentTimeMillis().toString
timestamp: String = 1406279679674

ОБНОВИТЬ

в основном это зависит от вашего ключа строки, если rowKey ваш userId или что-то, тогда нет никакой возможности представить дубликат записи в миллисекундах, но если вы думаете, что это может быть повторено, то используйте

val timestamp = com.eaio.uuid.UUIDGen.newTime().toString

это работа для версии cassandra 4.x

сначала импортируйте библиотеку вbuild.sbt

      libraryDependencies ++= Seq(
  "com.datastax.oss" % "java-driver-core" % "4.15.0"
)

пример

      import com.datastax.oss.driver.api.core.uuid.Uuids

import java.time.ZonedDateTime

object Test extends App {
  val timeText = "2022-01-01T00:01:01.002345Z"
  val datetime = ZonedDateTime.parse(timeText)
  val uuid = Uuids.endOf(datetime.toInstant.toEpochMilli)
  println(uuid) // e79b51af-6a95-11ec-7f7f-7f7f7f7f7f7f
}

тест на кассандре

      cqlsh:test> create table aaa (id timeuuid primary key, t text);

cqlsh:test> insert into aaa(id,t) values(e79b51af-6a95-11ec-7f7f-7f7f7f7f7f7f, 't4');

cqlsh:test> select toTimestamp(id), t from aaa;

 system.totimestamp(id)          | t
---------------------------------+----
 2022-01-01 00:01:01.002000+0000 | t4

Другие вопросы по тегам