26

次の数字を推測しないJavaで整数の一意のIDを生成するにはどうすればよいですか?

4

10 に答える 10

56

それはどれほどユニークである必要がありますか?

プロセス内でのみ一意である場合は、新しい値が必要になるたびにを使用しAtomicIntegerて呼び出すことができます。incrementAndGet()

于 2010-02-01T18:20:19.183 に答える
8
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

synchronizedスレッドセーフにしたい場合は追加します。

于 2010-02-01T18:19:49.770 に答える
7
 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();
        }
    }

}

これがお役に立てば幸いです。

于 2012-08-21T12:07:56.883 に答える
4

多少の制約がある場合は簡単です。

スレッドが1つある場合は、uniqueID++を使用するだけです。終了するときは、必ず現在のuniqueIDを保存してください。

複数のスレッドがある場合、一般的な同期されたgenerateUniqueIDメソッドが機能します(上記と同じように実装されます)。

問題は、クラスターまたはピアツーピアゲームのような分散セットアップのいずれかに多数のCPUがある場合です。

その場合、通常、2つの部分を組み合わせて1つの数値を形成できます。たとえば、一意のIDを生成する各プロセスには、独自の2バイトのID番号を割り当てて、それをuniqueID++と組み合わせることができます。何かのようなもの:

return (myID << 16) & uniqueID++

「myID」の部分を配布するのは難しいかもしれませんが、いくつかの方法があります。一元化されたデータベースから1つを取得し、一元化されたサーバーから一意のIDを要求するだけです...

IntではなくLongを使用している場合、一般的なトリックの1つは、サーバーに固有であることが保証されているETH0のデバイスID(UUID)を取得し、シリアル番号を追加することです。

于 2010-02-01T18:55:55.843 に答える
2

本当にintではなく整数を意味する場合:

Integer id = new Integer(42); // will not == any other Integer

JVMの外部で他のプロセスやユーザー、永続的、または他の多くの考慮事項に見えるものが必要な場合は、他のアプローチがありますが、コンテキストがない場合は、内部のオブジェクトIDの組み込みの一意性を使用する方がよいでしょう。あなたのシステム。

于 2010-02-01T19:21:20.833 に答える
1

あなたはそれが必要ですか?

  • 同時に実行されている2つのJVM間で一意です。
  • JVMが再起動された場合でも一意です。
  • スレッドセーフ。
  • nullをサポートしますか?そうでない場合は、intまたはlongを使用します。
于 2010-02-04T22:08:10.913 に答える
1

IDを生成し、生成されたIDのリストにすでに存在するかどうかを確認するだけです。

于 2010-02-01T18:19:12.567 に答える
1

UUIDクラス

于 2010-02-01T18:20:06.150 に答える
0

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); 
于 2021-10-23T06:21:14.293 に答える
-1

いつでもユニーク:

int uniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
于 2014-10-20T18:41:39.463 に答える