Frage

Ich brauche eine eindeutige Zahl von 32 Bit in Java zu erzeugen. Ich brauche die Zahl als Java int zurück, die von der Schnittstelle erforderlich ist. Können Sie mir bitte einige Ideen auf diese teilen?

Die Zahl wird als MySQL PK und mehrere Threads verwendet werden könnten, ihre eigene eindeutige ID zur gleichen Zeit werden zu generieren. (Leider entschieden wird, nicht MySQL zu verwenden inkrementelle id)

habe ich versucht, UUID-Klasse, aber es scheint, dass die Daten, die es erzeugt mehr Bits als ich verwenden kann.

fand ich diese aber nicht sicher, ob es funktioniert:

    // 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);
War es hilfreich?

Lösung

Wie „einzigartig“ sind Sie wollen? Kurz gesagt, was ist die Kollisionsdomäne? Wenn Sie mit Tausenden von Tasten dann Random.nextInt () tut genau das, was Sie relativ wollen, was Sie versucht, mit der Version 4 UUID (UUID v4 erzeugt 128 Zufallsbits).

Wenn Sie etwas mit einer geringeren Wahrscheinlichkeit von Kollision benötigen, dann müssen Sie eine global erhöht ganze Zahl haben, aber es ist viel Sorgfalt hier getroffen werden, wie Zustand zwischen JVM Start-ups zu halten. Dafür sollte man sich in AtomicIntegers .

Andere Tipps

Der SecureRandom Ansatz ist in Ordnung, aber nicht setzt die Samen auf sie. Es wird seine eigenen Samen in eine (vermutlich) einem sicheren Art und Weise wählen.

Sie können auch eine UUID verwenden und entsorgen Sie nur die Bits, die Sie nicht benötigen, z.

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

EDIT: Sie sollten sich auch bewusst sein, dass die SecureRandom ist deutlich langsamer als Random. Da Sie hier nicht Krypto tun, warum Random nicht benutzen?

ich denke, Sie eine 32-Bit-Hash-Funktion verwenden können. Details sind in der folgenden Anleitung gegeben 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;

    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top