La pregunta en stackoverflow.com/questions/325443/generate-uuid-in-java es más acerca de las colisiones de GUID, entonces, ¿cuál es el equivalente de un GUID en la pila de tecnología de Java, que es lo que (creo) es más foco de esta pregunta.
Jon Adams
Respuestas:
348
Eche un vistazo a la clase UUID incluida con Java 5 y versiones posteriores.
Por ejemplo:
Si desea un UUID aleatorio, puede usar el método randomUUID .
Si desea que un UUID se inicialice a un valor específico, puede usar el constructor UUID o el método fromString .
¿podría volver a repetir? porque Guid nunca va a repetir
angel
44
@angel Sí, es teóricamente posible que el UUID.randomUUIDmétodo devuelva un duplicado, pero esto no es una preocupación realista . La implementación de Oracle / OpenJDK utiliza un generador de números aleatorios criptográficamente fuerte. Dado eso, y dado el rango astronómico dado por tantos bits en un UUID, puede generar muchos millones de tales valores en su aplicación y aún así dormir bien. El uso de una de las otras variantes reduce aún más la posibilidad de colisiones aún más cercanas a cero debido al uso de "espacio y tiempo", [1] dirección MAC o nombre, y [2] fecha-hora actual, como restricciones.
Basil Bourque
@RenniePet Eh, si eres tan paranoico y tienes acceso a la lista de ID ya utilizadas al crear una nueva, solo generas nuevas whilehasta que tienes una que no está dentro de tu lista: p
Nyerguds
2
El generador de números aleatorios criptográficos de Oracle suele ser un PRNG con una semilla aleatoria. La semilla aleatoria se obtiene típicamente usando una fuente de "entropía" proporcionada por el sistema operativo. Si puede degradar o comprometer esa fuente, entonces aumenta la probabilidad de que un generador de números aleatorios criptográficos produzca el mismo número. También vale la pena señalar que en algunas plataformas (por ejemplo, virtualizadas), el sistema operativo puede quedarse sin entropía. Hay "trucos poco fiables" para solucionar esto, pero implican degradar la calidad de la entropía.
Stephen C
Esto no es solo una preocupación académica. He visto una afirmación ( ¡no verificada! ) De que alguien tuvo problemas con UUIDs aleatorios que no son únicos.
La UUIDclase estándar de Java genera UUID de versión 4 (aleatorios). ( ACTUALIZACIÓN : también se pueden generar UUID de versión 3 (nombre)). También puede manejar otras variantes, aunque no puede generarlas. (En este caso, "manejar" significa construir UUIDinstancias de long, byte[]o Stringrepresentaciones, y proporcionar algunos accesores apropiados).
La implementación de Java UUID Generator (JUG) pretende admitir "los 3 tipos 'oficiales' de UUID según lo definido por RFC-4122 " ... aunque el RFC en realidad define 4 tipos y menciona un quinto tipo.
Para obtener más información sobre los tipos y variantes de UUID, hay un buen resumen en Wikipedia , y los detalles sangrientos se encuentran en RFC 4122 y otras especificaciones.
No es completamente cierto, también puede generar UUID basados en nombres (versión 3) conUUID.nameUUIDFromBytes(byte[] name)
DennisK
Estoy corregido. Me basé en la descripción de javadoc que dice "Fábrica estática para recuperar un UUID de tipo 3 (basado en el nombre) basado en la matriz de bytes especificada"
Stephen C
No creo que la publicación sea precisa. Los documentos Java UUID indican que el constructor genera una variante de tipo 2, no aleatoria. Para uso tipo 3 public static UUID nameUUIDFromBytes(byte[] name). para uso tipo 4 public static UUID randomUUID(). El tipo 1 no está disponible con la clase JDK.
slartibartfast
No. Creo que lo entendí bastante bien. El estado javadocs: "aunque los constructores permiten la creación de cualquier variante de UUID (que se describe a continuación)". y 4 variantes se enumeran a continuación, incluido el tipo 1. De hecho, lea el javadoc paraclockSequence()
Stephen C
27
Solo para extender la respuesta de Mark Byers con un ejemplo:
Si desea otras versiones de UUID, una vía es hacer que su aplicación Java llegue fuera de la JVM para generar UUID llamando a:
Utilidad de línea de comandos Incluido con casi todos los sistemas operativos. Por ejemplo, se uuidgenencuentra en Mac OS X, BSD y Linux.
Servidor de base de datos Utilice JDBC para recuperar un UUID generado en el servidor de base de datos. Por ejemplo, la uuid-osspextensión a menudo se incluye con Postgres . Esa extensión puede generar los valores de las versiones 1, 3 y 4 y, adicionalmente, un par de variaciones:
uuid_generate_v1mc() - genera un UUID versión 1 pero usa una dirección MAC de multidifusión aleatoria en lugar de la dirección MAC real de la computadora.
uuid_generate_v5(namespace uuid, name text) - genera un UUID de la versión 5, que funciona como un UUID de la versión 3, excepto que SHA-1 se utiliza como método de hash.
Tengo algunos problemas con su respuesta: en primer lugar, ya se demostró que era incorrecto que solo puede obtener V4 de la biblioteca estándar de Java (también es posible V3). En segundo lugar, hace que parezca que no hay opciones dentro de Java además de la biblioteca estándar, junto con un "debido a problemas de seguridad". Y, por último, es generalmente ineficiente (en cuanto a programación y / o rendimiento) comenzar dependiendo de fuentes externas cuando hay muchas maneras de hacerlo dentro de Java (a menos que lo necesite en ellas, por supuesto, por ejemplo, como parte de la creación de un registro en el servidor SQL).
Respuestas:
Eche un vistazo a la clase UUID incluida con Java 5 y versiones posteriores.
Por ejemplo:
fuente
java.util.UUID.randomUUID();
fuente
UUID.randomUUID
método devuelva un duplicado, pero esto no es una preocupación realista . La implementación de Oracle / OpenJDK utiliza un generador de números aleatorios criptográficamente fuerte. Dado eso, y dado el rango astronómico dado por tantos bits en un UUID, puede generar muchos millones de tales valores en su aplicación y aún así dormir bien. El uso de una de las otras variantes reduce aún más la posibilidad de colisiones aún más cercanas a cero debido al uso de "espacio y tiempo", [1] dirección MAC o nombre, y [2] fecha-hora actual, como restricciones.while
hasta que tienes una que no está dentro de tu lista: pDepende del tipo de UUID que desee.
La
UUID
clase estándar de Java genera UUID de versión 4 (aleatorios). ( ACTUALIZACIÓN : también se pueden generar UUID de versión 3 (nombre)). También puede manejar otras variantes, aunque no puede generarlas. (En este caso, "manejar" significa construirUUID
instancias delong
,byte[]
oString
representaciones, y proporcionar algunos accesores apropiados).La implementación de Java UUID Generator (JUG) pretende admitir "los 3 tipos 'oficiales' de UUID según lo definido por RFC-4122 " ... aunque el RFC en realidad define 4 tipos y menciona un quinto tipo.
Para obtener más información sobre los tipos y variantes de UUID, hay un buen resumen en Wikipedia , y los detalles sangrientos se encuentran en RFC 4122 y otras especificaciones.
fuente
UUID.nameUUIDFromBytes(byte[] name)
public static UUID nameUUIDFromBytes(byte[] name)
. para uso tipo 4public static UUID randomUUID()
. El tipo 1 no está disponible con la clase JDK.clockSequence()
Solo para extender la respuesta de Mark Byers con un ejemplo:
fuente
Las otras respuestas son correctas, especialmente éste por Stephen C .
Llegar fuera de Java
La generación de un valor UUID dentro de Java está limitada a la Versión 4 (aleatoria) debido a problemas de seguridad.
Si desea otras versiones de UUID, una vía es hacer que su aplicación Java llegue fuera de la JVM para generar UUID llamando a:
Incluido con casi todos los sistemas operativos.
Por ejemplo, se
uuidgen
encuentra en Mac OS X, BSD y Linux.Utilice JDBC para recuperar un UUID generado en el servidor de base de datos.
Por ejemplo, la
uuid-ossp
extensión a menudo se incluye con Postgres . Esa extensión puede generar los valores de las versiones 1, 3 y 4 y, adicionalmente, un par de variaciones:uuid_generate_v1mc()
- genera un UUID versión 1 pero usa una dirección MAC de multidifusión aleatoria en lugar de la dirección MAC real de la computadora.uuid_generate_v5(namespace uuid, name text)
- genera un UUID de la versión 5, que funciona como un UUID de la versión 3, excepto que SHA-1 se utiliza como método de hash.Por ejemplo, UUID Generator crea las versiones 1 y 3, así como valores nulos y GUID .
fuente