如何在Java中创建64位唯一整数

joh*_*ohn 2 java random 64-bit uuid long-integer

我需要在Java中创建一个64位唯一整数,以便碰撞机会很低.系统不是分布式的,因此不同计算机之间的冲突不是问题.

有没有办法,我们可以在Java中创建一个64位整数,它总是唯一的?

截至目前我正在使用 -

long number = System.nanoTime();
Run Code Online (Sandbox Code Playgroud)

这是在Java中生成64位唯一整数的正确方法还是我可以尝试其他任何东西?

更新: -

这样做怎么样?这会是独一无二的吗?

UUID number = UUID.randomUUID();
long uniqueNumber = number.timestamp();
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 6

如果您需要在一个进程中唯一的数字,在重新启动之间保持稳健,您可以使用简单的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个独特的"时间戳",精确到毫秒,但每秒只能处理1000个ID,而不会超过实际时间.这在重启时工作正常,因为时间会超过之前的值(再次假设你平均每秒不到一百万)


krs*_*ynx 5

使用HashSet以确保您存储的值的唯一性。然后,您可以通过检查add返回的内容来检查插入是否成功。如果必须将值“随机化”,您可以使用自己的算法,或查看SecureRandom

Long getUniqueNumber(HashSet uniqueNumberSet) {
    Long unique = generateUniqueNumber();
    if(!uniqueNumberSet.add(unique)) { // handle collision }
    return unique;
}
Run Code Online (Sandbox Code Playgroud)