From aa73bd3fa1c08c896686a81c77f54949f90df905 Mon Sep 17 00:00:00 2001 From: Daniel Albuquerque <1187103+worldtiki@users.noreply.github.com> Date: Wed, 28 Feb 2024 02:29:18 +0000 Subject: [PATCH] New factory method to create TimeBasedEpochRandomGenerator (#99) --- release-notes/CREDITS | 5 ++++ release-notes/VERSION | 5 ++++ .../java/com/fasterxml/uuid/Generators.java | 23 +++++++++++++++++++ .../com/fasterxml/uuid/impl/UUIDUtilTest.java | 10 ++++++++ 4 files changed, 43 insertions(+) diff --git a/release-notes/CREDITS b/release-notes/CREDITS index 0cec5aa..e55939e 100644 --- a/release-notes/CREDITS +++ b/release-notes/CREDITS @@ -143,3 +143,8 @@ Pavel Raev (magdel@github) Maia Everett (Maia-Everett@github) * Contributed #85: Fix `LazyRandom` for native code generation tools [5.0.0] + +Daniel Albuquerque (worldtiki@github) + * Contributed #99: New factory method to create TimeBasedEpochRandomGenerator + [5.1.0] + diff --git a/release-notes/VERSION b/release-notes/VERSION index 89cf95d..94cd989 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -4,6 +4,11 @@ Project: java-uuid-generator Releases ============================================================================ +5.1.0 (not yet released) + +#99: New factory method to create TimeBasedEpochRandomGenerator + (contributed by Daniel A) + 5.0.0 (23-Feb-2024) #53: Increase JDK baseline to JDK 8 diff --git a/src/main/java/com/fasterxml/uuid/Generators.java b/src/main/java/com/fasterxml/uuid/Generators.java index 8f63bf4..8f2d976 100644 --- a/src/main/java/com/fasterxml/uuid/Generators.java +++ b/src/main/java/com/fasterxml/uuid/Generators.java @@ -126,6 +126,11 @@ public static NameBasedGenerator nameBasedGenerator(UUID namespace, MessageDiges /** * Factory method for constructing UUID generator that generates UUID using * version 7 (Unix Epoch time+random based). + *
+ * NOTE: calls within same millisecond produce very similar values; this may be + * unsafe in some environments. + *
+ * No additional external synchronization is used. */ public static TimeBasedEpochGenerator timeBasedEpochGenerator() { @@ -166,6 +171,24 @@ public static TimeBasedEpochGenerator timeBasedEpochGenerator(Random random, return new TimeBasedEpochGenerator(random, clock); } + // // Epoch Time+random generation + + /** + * Factory method for constructing UUID generator that generates UUID using + * version 7 (Unix Epoch time+random based). + *
+ * Calls within same millisecond use additional per-call randomness to try to create + * more distinct values, compared to {@link #timeBasedEpochGenerator(Random)} + *
+ * No additional external synchronization is used. + * + * @since 5.1 + */ + public static TimeBasedEpochRandomGenerator timeBasedEpochRandomGenerator() + { + return timeBasedEpochRandomGenerator(null); + } + /** * Factory method for constructing UUID generator that generates UUID using * version 7 (Unix Epoch time+random based), using specified {@link Random} diff --git a/src/test/java/com/fasterxml/uuid/impl/UUIDUtilTest.java b/src/test/java/com/fasterxml/uuid/impl/UUIDUtilTest.java index bcf972f..9186e74 100644 --- a/src/test/java/com/fasterxml/uuid/impl/UUIDUtilTest.java +++ b/src/test/java/com/fasterxml/uuid/impl/UUIDUtilTest.java @@ -61,6 +61,16 @@ public void testExtractTimestampUUIDEpochBased() { } } + public void testExtractTimestampUUIDEpochRandomBased() { + TimeBasedEpochRandomGenerator generator = Generators.timeBasedEpochRandomGenerator(); + final Random rnd = new Random(3); + for (int i = 0; i < TEST_REPS; i++) { + long rawTimestamp = rnd.nextLong() >>> 16; + UUID uuid = generator.construct(rawTimestamp); + assertEquals(rawTimestamp, UUIDUtil.extractTimestamp(uuid)); + } + } + public void testExtractTimestampUUIDOnOtherValues() { assertEquals(0L, UUIDUtil.extractTimestamp(null)); assertEquals(0L, UUIDUtil.extractTimestamp(UUID.fromString("00000000-0000-0000-0000-000000000000")));