Java次の数字を推測しない整数)の一意のIDを生成する方法は?
それはどれほどユニークである必要がありますか?
プロセス内でのみ一意の場合、 AtomicInteger
を使用して、新しい値が必要になるたびに incrementAndGet()
を呼び出すことができます。
int uniqueId = 0;
int getUniqueId()
{
return uniqueId++;
}
スレッドセーフにする場合は、synchronized
を追加します。
多少の制約がある場合は簡単です。
スレッドが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の組み込みの一意性を使用することをお勧めしますシステム。
IDを生成し、生成されたIDのリストに既に存在するかどうかを確認します。
あなたはそれが必要ですか?
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();
}
}
}
これがお役に立てば幸いです。