我需要在 Java 中创建一个 64 位唯一整数,以降低冲突几率。该系统不是分布式的,因此不同计算机之间的冲突不是问题。
有什么办法,我们可以在 Java 中创建一个始终唯一的 64 位整数?
截至目前,我正在使用 -
long number = System.nanoTime();
这是在 Java 中生成 64 位唯一整数的正确方法还是我可以尝试其他方法?
更新:-
这样做怎么样?这会是独一无二的吗?
UUID number = UUID.randomUUID();
long uniqueNumber = number.timestamp();
最佳答案
如果您需要数字在一个进程中是唯一的,并且在重新启动之间保持稳健,您可以使用一个简单的 AtomicLong 和一个计时器。
private static final AtomicLong TS = new AtomicLong();
public static long getUniqueTimestamp() {
long micros = System.currentTimeMillis() * 1000;
for ( ; ; ) {
long value = TS.get();
if (micros <= value)
micros = value + 1;
if (TS.compareAndSet(value, micros))
return micros;
}
}
这将为您提供精确到毫秒的唯一“时间戳”,但每毫秒只能处理 1000 个 ID,而不会超前于实际时间。这在重新启动时工作正常,因为时间会跳过以前的值(再次假设平均每秒少于一百万)
关于java - 如何在 Java 中创建 64 位唯一整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28370747/