次の数字を推測しない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);