web-dev-qa-db-ja.com

Java(整数)で一意のIDを生成する方法は?

Java次の数字を推測しない整数)の一意のIDを生成する方法は?

22
Sajad Bahmani

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

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

54
Simon Nickerson
int uniqueId = 0;

int getUniqueId()
{
    return uniqueId++;
}

スレッドセーフにする場合は、synchronizedを追加します。

8
Mark Byers

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

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

複数のスレッドがある場合、共通の同期化されたgenerateUniqueIDメソッドが機能します(上記と同じ実装です)。

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

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

return (myID << 16) & uniqueID++

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

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

4
Bill K

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

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

JVMの外部で他のプロセスまたはユーザー、永続性、またはその他の考慮事項のホストに対して何かを表示したい場合は、他のアプローチがありますが、コンテキストがない場合は、オブジェクトIDの組み込みの一意性を使用することをお勧めしますシステム。

2
Pete Kirkham

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

1
Mykola Golubyev
1
Jim Barrows

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

  • 同時に実行されている2つのJVM間で一意です。
  • jVMが再起動されても一意です。
  • スレッドセーフ。
  • nullをサポートしますか?そうでない場合は、intまたはlongを使用します。
1
Peter Lawrey
 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
user1614168