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)
如果您需要在一个进程中唯一的数字,在重新启动之间保持稳健,您可以使用简单的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,而不会超过实际时间.这在重启时工作正常,因为时间会超过之前的值(再次假设你平均每秒不到一百万)
使用HashSet以确保您存储的值的唯一性。然后,您可以通过检查add返回的内容来检查插入是否成功。如果必须将值“随机化”,您可以使用自己的算法,或查看SecureRandom。
Long getUniqueNumber(HashSet uniqueNumberSet) {
Long unique = generateUniqueNumber();
if(!uniqueNumberSet.add(unique)) { // handle collision }
return unique;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5983 次 |
| 最近记录: |