快速生成ID并具有很高的唯一性

dan*_*eln 5 java random uuid

我想为应用程序中发生的事件生成ID。

事件频率取决于用户负载,因此每秒可能发生数十万次。

我不能使用UUID.randomUUID(),因为它可能是在性能上的问题问题-看看这个

我想到生成ID如下:

System.currentTimeMillis() + ";" + Long.toString(_random.nextLong())
Run Code Online (Sandbox Code Playgroud)

什么时候_random是静态java.util.Random课程?

我的问题是:

  1. 您是否认为此组合的分布足以满足我的需求?
  2. Java的Random实现是否与当前时间相关,因此我将两者结合在一起是危险的吗?

Pet*_*rey 5

我将使用以下内容。

final AtomicLong counter = new AtomicLong(System.currentTimeMillis() * 1000);
Run Code Online (Sandbox Code Playgroud)

long l = counter.getAndIncrement(); // takes less than 10 nano-seconds most of the time.
Run Code Online (Sandbox Code Playgroud)

如果您平均每秒少于一百万,那么这在您的系统内和重启之间将是唯一的。

即使以这种速度,该号码也不会在一段时间内溢出。

class Main {
    public static void main(String[] args) {
        System.out.println(new java.util.Date(Long.MAX_VALUE/1000));
    }
}
Run Code Online (Sandbox Code Playgroud)

版画

Sun Jan 10 04:00:54 GMT 294247
Run Code Online (Sandbox Code Playgroud)


des*_*tan 3

为了防止可能的冲突,我建议您以某种方式将用户的唯一 ID 集成到生成的 ID 中。您可以将用户 ID 直接添加到生成的 ID 中

System.currentTimeMillis() + ";" + Long.toString(_random.nextLong()) + userId
Run Code Online (Sandbox Code Playgroud)

或者您可以_random对每个使用用户 id 作为其种子的用户使用单独的。