2016-02-16 103 views
1

我有創建elasticsearch文檔的方法。它使用OpenStreetMap對象ID作爲ES文檔ID。我現在還想添加其他沒有OSM ID的文檔。java如何獲得長UID

由於該方法需要很長時間,我無法使用UUID生成器。

得到一個長類型的「僞」UUID的最佳方式是什麼?

+1

可能的重複[如何生成獨特的長使用UUID](http://stackoverflow.com/questions/15184820/how-to-generate-unique-long-using-uuid) – vk239

回答

2

你可以實現一個長的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!

0

如何如下:

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); 
    } 

}