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);
¿Fue útil?

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;

    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top