Cómo obtener el número de 32 bits única en Java?
Pregunta
necesito para generar un número único de 32 bits en Java. Tengo que devolver el número como int de Java, que es requerido por la interfaz. ¿Puede por favor compartir algunas ideas sobre esto?
El número será utilizado como MySQL PK y varios hilos podría estar generando su propio identificador único al mismo tiempo. (En este momento se decide no utilizar MySQL ID incremental)
He intentado clase UUID pero parece que los datos que genera tiene más bits que puedo usar.
He encontrado esto, pero no estoy seguro si funciona:
// 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);
Solución
¿Cómo "único" estás deseando? En pocas palabras, ¿cuál es el dominio de la colisión? Si se trata de miles de llaves después Random.nextInt () hace exactamente lo que quiere en relación con lo que ha intentado con la versión 4 UUID (UUID v4 genera 128 bits aleatorios).
Si necesita algo con una menor posibilidad de colisión Luego hay que tener un número entero incrementado en todo el mundo, pero hay mucho cuidado para ser tomado aquí como mantener el estado entre los arranques de JVM. Para que usted debe buscar en AtomicIntegers .
Otros consejos
El enfoque SecureRandom
está muy bien, pero no establecer la semilla en él. Se elegirá su propia semilla de una manera segura (presumiblemente).
También es posible usar un UUID y simplemente descartar los bits que no necesita, por ejemplo.
int key = (int)UUID.randomUUID().getLeastSignificantBits();
EDIT: También debe ser consciente de que el SecureRandom
es significativamente más lento que Random
. Puesto que usted no está haciendo cripto aquí, por qué no usar Random
?
creo que se puede utilizar una función hash de 32 bits. se dan detalles en el siguiente 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;
}