On Tue, 27 May 2025 21:59:55 GMT, Roger Riggs <rri...@openjdk.org> wrote:
>> I'd say "create" instead of "retrieve" in the first line comment. (Though >> that word is used in the other static factories). >> >> The "sub-millisecond precision" can't be relied upon. Its the precision that >> gives the impression that it can be added to the millisecond value and get >> an exact time. But the nano-second value is read from a different clock and >> the bits being used from it may wrap-around in the time between the reads of >> the clocks. >> The second description ("derived from") is makes fewer promises than the >> first-line comment. >> An application should not use them for any purpose other than random. And >> for that the buffer already contains random bytes. >> >> An alternative is to capture the MS time and the nano-time on first use to >> compute an offset and then use only the nano-time plus/minus the offset to >> create the version 7 UUIDs. > > The `timestamp` method may mislead an app developer thinking its the time > from the version 7 timestamp. > The first-line comment might make it more obvious if it says: > `The timestamp value associated with a version 1 UUID.` > > The Unix Epoch time would be easier to use if a method was added to return it. > `long UnixEpochTimeNanos()` (name subject to bike-shedding). > And throwing if it was not version 7. The first 48 bits need to be from the unix epoch time stamp in ms only to remain complaint. If I understand correctly, to be able to guarantee that the nsBits are actually time orderable, System.nanoTime() would have to be pinned to a point where System.currentTimeMillis() increments by 1ms (which doesnt seem possible). Otherwise any offset could be at any arbitrary point in a given millisecond and nsBits would wrap around from that. I think the options are to either use the random only approach with ms precision or an guaranteed monotonic counter based approach and take the hit on performance. I agree with updating to "create" from "retrieve" on the first line comment and also with the method name change to avoid confusion with UUIDv1, however to either unixEpochTimeNanos() or unixEpochTimeMillis() or otherwise depending on which implementation we settle on. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/25303#discussion_r2112383140