2

Java で一意の 32 ビット数を生成する必要があります。インターフェイスで必要な 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);
4

3 に答える 3

5

あなたはどのくらい「ユニーク」を望んでいますか?要するに、衝突ドメインとは何ですか? 数千のキーを扱っている場合、Random.nextInt()は、バージョン 4 UUID で試したものと比較して、正確に実行します (UUID v4 は 128 のランダム ビットを生成します)。

衝突の可能性が少ないものが必要な場合は、グローバルにインクリメントされた整数が必要ですが、JVM の起動間で状態を維持するなど、ここでは多くの注意が必要です。そのためには、AtomicIntegersを調べる必要があります。

于 2010-12-10T04:37:36.663 に答える
0

SecureRandomアプローチは問題ありませんが、シードを設定しないでください。(おそらく) 安全な方法で独自のシードを選択します。

UUID を使用して、必要のないビットを破棄することもできます。

int key = (int)UUID.randomUUID().getLeastSignificantBits();

SecureRandom編集:は よりも大幅に遅いことにも注意してくださいRandom。ここでは暗号化を行っていないので、使用しないのはなぜRandomですか ?

于 2010-12-10T04:34:54.307 に答える
0

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;

    }
于 2010-12-10T04:35:40.750 に答える