Domanda

Ho bisogno di generare un numero unico di 32 bit in Java. Ho bisogno di tornare il numero come Java int, che è richiesto dall'interfaccia. Potete per favore condividere alcune idee su questo?

Il numero sarà usato come MySQL PK e diversi fili potrebbe essere genera il proprio ID univoco allo stesso tempo. (Sorry si decide di non usare MySQL incrementale id)

Ho cercato di classe UUID ma sembra i dati generati ha più bit di quanto io possa usare.

Ho trovato questo, ma non è sicuro se funziona:

    // 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);
È stato utile?

Soluzione

Come "unico" Sei voler? In breve, qual è il dominio di collisione? Se avete a che fare con migliaia di chiavi poi Random.nextInt () fa esattamente ciò che si desidera rispetto a ciò che si è tentato con la versione 4 UUID (v4 UUID genera 128 bit casuali).

Se avete bisogno di qualcosa con un meno possibilità di collisione, allora avete bisogno di avere un intero incrementato a livello globale ma c'è molta cura da prendere qui come mantenere lo stato tra start-up JVM. Per questo si dovrebbe guardare in AtomicIntegers .

Altri suggerimenti

L'approccio SecureRandom va bene, ma non impostare il seme su di esso. Si sceglierà un proprio seme in un (presumibilmente) modo sicuro.

Si potrebbe anche usare un UUID e basta eliminare le parti che non servono, per esempio.

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

EDIT: Si dovrebbe anche essere consapevoli del fatto che il SecureRandom è significativamente più lento di Random. Dal momento che non stai facendo cripto qui, perché non usare Random?

penso che si può utilizzare una funzione hash a 32 bit. i dettagli sono riportati nella seguente tutorial 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;

    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top