java如何获取长如UID

java How to get a long as UID

我有创建弹性搜索文档的方法。它使用 OpenStreetMap 对象 ID 作为 ES 文档 ID。我现在还想添加其他没有 OSM id 的文档。

我不能使用 UUID 生成器,因为该方法需要很长时间。

获取 "pseudo" 长类型 UUID 的最佳方法是什么?

下面的怎么样:

import org.apache.commons.lang3.RandomStringUtils;

public class RandomLong {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        long id = Long.parseLong(RandomStringUtils.randomNumeric(18));
        System.out.println("id = " + id);
    }

}

它确保正多头,非常适合 ID。

这是另一个答案,它通过使用纳米时间和原子计数器更加强调唯一性。

import java.util.concurrent.atomic.AtomicInteger;

public class UniqueLong {


    static AtomicInteger atom = new AtomicInteger(0);

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        long id = Long.parseLong(System.nanoTime() + "" + (atom.getAndIncrement() % 1_000));
        System.out.println("id = " + id);
    }

}

您可以实现生成 64 位随机序列的长 UID,即使用 AtomicLong()。

AtomicLong is a long value that may be updated atomically. An AtomicLong is used in applications such as atomically incremented sequence numbers

private static final AtomicLong TS = new AtomicLong();
public static long getUniqueTimestamp() {
    return TS.incrementAndGet();
}

每次调用 getUniqueTimestamp() returns 进程的唯一 ID,从 0 开始。

您可以从更高的值开始,用当前时间初始化 Atomic:

private static final AtomicLong TS = new AtomicLong(System.currentTimeMillis() * 1000);

备注

这不是通用 UID,只是一个 UID!