Come ottenere il numero di 32 bit unico in Java?
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);
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;
}