unico randomuuid que identificador generate generar funciona como java persistence uuid uniqueidentifier

java - que - uuid randomuuid() tostring()



Generando un identificador Ășnico global en Java (6)

Resumen: estoy desarrollando una aplicación web Java persistente, y necesito asegurarme de que todos los recursos que persisto tengan identificadores únicos a nivel mundial para evitar duplicados.

La letra pequeña:

  1. No estoy usando un RDBMS, así que no tengo ningún generador de secuencias de fantasía (como el proporcionado por Oracle)
  2. Me gustaría que fuera rápido, preferiblemente todo en la memoria, prefiero no tener que abrir un archivo e incrementar algún valor
  3. Debe ser seguro para subprocesos (estoy anticipando que solo una JVM a la vez necesitará generar identificadores)
  4. Es necesario que haya coherencia entre las instancias de la JVM. Si el servidor se apaga y se inicia, el generador de ID no debe volver a generar los mismos ID que generó en instancias previas (o al menos la oportunidad tiene que ser realmente, muy delgada, anticipo muchos millones de recursos presionados)
  5. He visto los ejemplos en el artículo de patrón de ID único de EJB. No funcionarán para mí (prefiero no confiar únicamente en System.currentTimeMillis () porque persistiremos en múltiples recursos por milisegundo).
  6. He visto las respuestas propuestas en esta pregunta . Mi preocupación sobre ellos es, ¿cuál es la posibilidad de que obtenga una identificación duplicada con el tiempo? Estoy intrigado por la sugerencia de usar java.utiloncesID para un UUID , pero una vez más, las posibilidades de un duplicado deben ser infinitamente pequeñas.
  7. Estoy usando JDK6

Bastante seguro de que los UUID son "lo suficientemente buenos". Hay 340,282,366,920,938,463,463,374,607,431,770,000,000 UUID disponibles.

http://www.wilybeagle.com/guid_store/guid_explain.htm

"Para poner estas cifras en perspectiva, se estima que el riesgo anual de ser golpeado por un meteorito es una posibilidad en 17 mil millones, lo que significa que la probabilidad es de aproximadamente 0.00000000006 (6 × 10-11), lo que equivale a la posibilidad de crear algunos decenas de billones de UUID en un año y con un duplicado. En otras palabras, solo después de generar mil millones de UUID cada segundo durante los próximos 100 años, la probabilidad de crear solo un duplicado sería de aproximadamente 50%. La probabilidad de un duplicado sería aproximadamente el 50% si cada persona en la tierra posee 600 millones de UUID "

http://en.wikipedia.org/wiki/Universally_Unique_Identifier


Desde la memoria, los paquetes remotos de RMI contienen un generador de UUID. No sé si eso vale la pena investigar.

Cuando tuve que generarlos normalmente uso un hash MD5 de la hora actual, el nombre de usuario y la dirección IP de la computadora. Básicamente, la idea es tomar todo lo que pueda averiguar sobre la computadora / persona y luego generar un hash MD5 de esta información.

Funciona muy bien y es increíblemente rápido (una vez que haya inicializado el MessageDigest por primera vez).


public class UniqueID { private static long startTime = System.currentTimeMillis(); private static long id; public static synchronized String getUniqueID() { return "id." + startTime + "." + id++; } }


¿por qué no hacer esto?

String id = Long.toString(System.currentTimeMillis()) + (new Random()).nextInt(1000) + (new Random()).nextInt(1000);


Si necesita ser único por PC: probablemente podría usar (System.currentTimeMillis() << 4) | (staticCounter++ & 15) (System.currentTimeMillis() << 4) | (staticCounter++ & 15) o algo así.

Eso te permitiría generar 16 por ms. Si necesita más, cambie por 5 yy con 31 ...

si necesita ser único en varias PC, también debe combinarlo en la dirección MAC de su tarjeta de red principal.

editar: aclarar

private static int staticCounter=0; private final int nBits=4; public long getUnique() { return (currentTimeMillis() << nBits) | (staticCounter++ & 2^nBits-1); }

y cambie nBits a la raíz cuadrada del número más grande que deba generar por ms.

Eventualmente se renovará. Probablemente 20 años o algo con nBits en 4.