Java 没有重复的序列生成

Java Sequence Generation without repetition

我有一个特定的要求,即为当天生成一个唯一的序列号。即使 JVM 重新启动,实用程序也应该能够生成序列而不重复。

先决条件:

Sequence format: ######## (8 digits max)

注意:在不同的节点实例中这将是 运行,因此序列的第一位保留用于标识节点。

一个简单的 clock-based 解决方案可能如下所示:

static int seq(int nodeId) {
    int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
    try {
        Thread.sleep(1); // introduce delay to ensure the generated values are unique
    } catch (InterruptedException e) {}
    return  val;
}

延迟可以额外随机化(最多 5 毫秒):

static Random random = new SecureRandom();
static int seq(int nodeId) {
    int val = nodeId * 100_000_000 + (int) (System.currentTimeMillis() % 100_000_000);
    try {
        Thread.sleep(1 + random.nextInt(4));
    } catch (InterruptedException e) {}
    return  val;
}