Crear un GUID en Java


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 .

77
Si incluye un ejemplo como lo hizo Kaleb Brasee, su buena respuesta sería aún mejor.
Zero3

Funciona en AndroidStudio 2.3 y en los niveles de API 21 y posteriores al menos. Quizás más atrás también.
raddevus

66
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger

420

java.util.UUID.randomUUID();


2
¿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.
Stephen C

32

Depende del tipo de UUID que desee.

  • 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.


1
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:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}

7

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:

  • 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.
  • Servicio web
    Por ejemplo, UUID Generator crea las versiones 1 y 3, así como valores nulos y GUID .

3
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).
DennisK
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.