次の数字を推測しないJavaで整数の一意のIDを生成するにはどうすればよいですか?
10 に答える
それはどれほどユニークである必要がありますか?
プロセス内でのみ一意である場合は、新しい値が必要になるたびにを使用しAtomicIntegerて呼び出すことができます。incrementAndGet()
int uniqueId = 0;
int getUniqueId()
{
    return uniqueId++;
}
synchronizedスレッドセーフにしたい場合は追加します。
 import java.util.UUID;
 public class IdGenerator {
    public static int generateUniqueId() {      
        UUID idOne = UUID.randomUUID();
        String str=""+idOne;        
        int uid=str.hashCode();
        String filterStr=""+uid;
        str=filterStr.replaceAll("-", "");
        return Integer.parseInt(str);
    }
    // XXX: replace with java.util.UUID
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println(generateUniqueId());
            //generateUniqueId();
        }
    }
}
これがお役に立てば幸いです。
多少の制約がある場合は簡単です。
スレッドが1つある場合は、uniqueID++を使用するだけです。終了するときは、必ず現在のuniqueIDを保存してください。
複数のスレッドがある場合、一般的な同期されたgenerateUniqueIDメソッドが機能します(上記と同じように実装されます)。
問題は、クラスターまたはピアツーピアゲームのような分散セットアップのいずれかに多数のCPUがある場合です。
その場合、通常、2つの部分を組み合わせて1つの数値を形成できます。たとえば、一意のIDを生成する各プロセスには、独自の2バイトのID番号を割り当てて、それをuniqueID++と組み合わせることができます。何かのようなもの:
return (myID << 16) & uniqueID++
「myID」の部分を配布するのは難しいかもしれませんが、いくつかの方法があります。一元化されたデータベースから1つを取得し、一元化されたサーバーから一意のIDを要求するだけです...
IntではなくLongを使用している場合、一般的なトリックの1つは、サーバーに固有であることが保証されているETH0のデバイスID(UUID)を取得し、シリアル番号を追加することです。
本当にintではなく整数を意味する場合:
Integer id = new Integer(42); // will not == any other Integer
JVMの外部で他のプロセスやユーザー、永続的、または他の多くの考慮事項に見えるものが必要な場合は、他のアプローチがありますが、コンテキストがない場合は、内部のオブジェクトIDの組み込みの一意性を使用する方がよいでしょう。あなたのシステム。
あなたはそれが必要ですか?
- 同時に実行されている2つのJVM間で一意です。
 - JVMが再起動された場合でも一意です。
 - スレッドセーフ。
 - nullをサポートしますか?そうでない場合は、intまたはlongを使用します。
 
IDを生成し、生成されたIDのリストにすでに存在するかどうかを確認するだけです。
intのみが必要な場合は、AtomicIntegerでそれが可能になります。
Stringが必要な場合は、timeStampとAtomicLongを組み合わせて以下のコードを実行する必要があります。
AtomicLong idCounter =  new AtomicLong(100);
long timestamp = System.currentTimeMillis();
long nextLong = idCounter.incrementAndGet();
String randomId = String.valueOf(timestamp)+String.valueOf(nextLong); 
    いつでもユニーク:
int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);