質問
Iを生成しなければならないユニークな番号の32ビットJava.私に戻る必要があるのJava intである必要はインターフェース。ありがとうございます。もアイデア。
数として使用しますMySQL PKおよび複数のスレッドが生成は、独自のidです。(すいませんのでないことを決定したMySQLの増id)
またUUIDのクラスがそのデータを生成する超ビット以上で利用します。
こないだ作品:
// seems no way to get int
UUID id = UUID.randomUUID();
System.out.println(id);
// not working either?
java.rmi.server.UID uid = new java.rmi.server.UID();
System.out.println(uid.toString());
// the one i am using
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
prng.setSeed(System.currentTimeMillis());
int ret = prng.nextInt();
System.out.println(ret);
解決
どのように"ならではの"いい?短のように衝突ンロードすることは可能です。を取扱っている場合は数千のキーその後 かせとなります。nextInt() いいただけたらと思ってい相対的に何をしたバージョン4Uuid(UUID v4生128ランダムなのです。
あなたが必要といってもいい出来になっているの少ない衝突しが必要となり世界的に増分を整数であ介する"アドベンチャーパークなどの状態保持の間のJVMできるサービスです。そしておくとよいでしょうへ AtomicIntegers.
他のヒント
SecureRandom
アプローチは結構ですが、それにシードを設定しないでください。これは、(おそらく)安全な方法でそれ自身のシードを選択します。
また、UUIDを使用し、ちょうどあなたが必要のないビットを捨てることができ、例えばます。
int key = (int)UUID.randomUUID().getLeastSignificantBits();
EDIT:あなたはまた、SecureRandom
がRandom
よりも大幅に遅くなることに注意する必要があります。あなたがここに暗号化を行っていないので、なぜRandom
を使わないのでしょうか?
私は、あなたが32ビットのハッシュ関数を使用することができると思います。 詳細については、次のチュートリアルに記載されています http://www.concentric.net/~ttwang/tech/inthash.htm
private static int hash(int key){
key = ~key + (key << 15); // key = (key << 15) - key - 1;
key = key ^ (key >>> 12);
key = key + (key << 2);
key = key ^ (key >>> 4);
key = key * 2057; // key = (key + (key << 3)) + (key << 11);
key = key ^ (key >>> 16);
return key;
}