我有創建elasticsearch文檔的方法。它使用OpenStreetMap對象ID作爲ES文檔ID。我現在還想添加其他沒有OSM ID的文檔。java如何獲得長UID
由於該方法需要很長時間,我無法使用UUID生成器。
得到一個長類型的「僞」UUID的最佳方式是什麼?
我有創建elasticsearch文檔的方法。它使用OpenStreetMap對象ID作爲ES文檔ID。我現在還想添加其他沒有OSM ID的文檔。java如何獲得長UID
由於該方法需要很長時間,我無法使用UUID生成器。
得到一個長類型的「僞」UUID的最佳方式是什麼?
你可以實現一個長的UID,產生一個64位的隨機序列,即使用AtomicLong()。
AtomicLong是一個很長的值,可以自動更新。一個 的AtomicLong在應用中使用的諸如原子遞增 序列號
private static final AtomicLong TS = new AtomicLong();
public static long getUniqueTimestamp() {
return TS.incrementAndGet();
}
getUniqueTimestamp()中的每一個調用返回一個唯一標識號過程中,從0
可以從啓動開始較高的值初始化原子與當前時間:
private static final AtomicLong TS = new AtomicLong(System.currentTimeMillis() * 1000);
這不是一個UNIVERSAL UID,只是一個UID!
如何如下:
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);
}
}
它確保積極的多頭,這是理想的標識。
下面是通過使用納秒時間和原子計數器更強調唯一性的另一個答案。
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);
}
}
可能的重複[如何生成獨特的長使用UUID](http://stackoverflow.com/questions/15184820/how-to-generate-unique-long-using-uuid) – vk239