2010-06-06 16 views
255

¿Cuáles son algunas de las mejores formas de crear un GUID en Java?Crear un GUID en Java

+14

@finneycanhelp - Sí, creo que tenemos cosas más simples como este en Stackoverflow también. Sé que me beneficio de ellos significativamente. El problema es que las personas se "entusiasman" mucho por publicar preguntas simples que son amigables para los motores de búsqueda por personas que ya conocen la respuesta y piensan que la pregunta es demasiado simple. Hago lo que acabo de hacer, cuando veo una pregunta simple que a la gente no le gusta, hago un comentario en apoyo de la pregunta. En este caso, es genial que la pregunta se haya cerrado porque las personas que buscan "GUID Java" lo encontrarán y luego podrán ver las respuestas a ambas preguntas. –

+2

La pregunta en http://stackoverflow.com/questions/325443/generate-uuid-in-java es más acerca de las colisiones GUID, entonces, ¿cómo es el equivalente de un GUID en la pila tecnológica de Java, que es qué (I pensar) es más el foco de esta pregunta. –

Respuesta

240

Eche un vistazo a UUID class incluido con Java 5 y posterior.

Por ejemplo:

  • Si quieres un UUID al azar puede utilizar el método randomUUID.
  • Si desea un UUID inicializado a un valor específico, puede utilizar el método UUID constructor o el fromString.
+2

Si incluye un ejemplo como lo hizo Kaleb Brasee, su buena respuesta sería incluso mejor. – Zero3

+0

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

288

java.util.UUID.randomUUID();

+29

Mientras los brainacs anteriores escriben disertaciones sobre la calidad o el contenido de la pregunta, o dan varios enlaces para la lectura extendida sobre el concepto de GUID, esta respuesta da 4 palabras, 3 períodos y abre y cierra paréntesis. Bravo Kaleb. – user1091524

+3

@angel Sí, es teóricamente posible que el método 'UUID.randomUUID' devuelva un duplicado, pero esto ** no es en absoluto una preocupación realista **. La implementación de Oracle/OpenJDK usa 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 dichos valores en su aplicación y aún dormir bien. El uso de una de las otras variantes reduce aún más la posibilidad de colisiones incluso más cerca de cero debido al uso de "espacio y tiempo", [1] dirección MAC o nombre, y [2] fecha-hora actual, como restricciones. –

+0

@RenniePet Eh, si eres tan paranoico, y tienes acceso a la lista de los ID ya usados ​​cuando creas uno nuevo, solo generas nuevos en un "while" hasta que obtienes uno que no está dentro su lista: p – Nyerguds

26

Depende de qué tipo de UUID desea.

  • El estándar de clase Java UUID genera Version 4 UUID (al azar). (ACTUALIZACIÓN - Version 3 (nombre) También se pueden generar UUID). También puede manejar otras variantes, aunque no puede generarlas. (En este caso, "mango" significa construir UUID casos de long, byte[] o String representaciones, y proporcionar algunos descriptores de acceso apropiados.)

  • La implementación Java UUID Generator (JUG) pretende apoyar "tipos todo 3 'oficial' de UUID como se define por RFC-4122 "... aunque el RFC realmente define 4 tipos y menciona un 5to tipo.

Para obtener más información sobre los tipos y variantes UUID, no es un buen resumen en Wikipedia, y los detalles morbosos están en RFC 4122 y las otras especificaciones.

+1

No es del todo cierto, también puede generar UUID basados ​​en nombre (versión 3) con 'UUID.nameUUIDFromBytes (byte [] name)' –

+0

Estoy corregido.Confié en la descripción javadoc que dice * "Fábrica estática para ** recuperar ** un UUID tipo 3 (basado en el nombre) basado en la matriz de bytes especificada." * –

+0

No creo que la publicación sea precisa. Los [UUID Java docs] (https://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html) indican que el constructor genera una variante de tipo 2, no aleatoria. Para el tipo 3 use 'UUID estático público nombreUUIDFromBytes (byte [] nombre)'. para el tipo 4 use 'UUID estático público randomUUID()'. Tipo 1 no está disponible con la clase JDK. – slartibartfast

6

Las otras respuestas son correctas, especialmente this one por Stephen C.

valor Alcanzar fuera de Java

Generating a UUID dentro de Java se limita a Version 4 (random) por motivos de seguridad.

Si desea otras versiones de UUID, uno de los caminos es que su alcance aplicación Java fuera del JVM para generar UUID llamando en:

  • línea de comandos de utilidad
    liado con casi todos los sistemas operativos .
    Por ejemplo, uuidgen que se encuentra en Mac OS X, BSD y Linux.
  • Servidor de base de datos
    Utilice JDBC para recuperar un UUID generado en el servidor de la base de datos.
    Por ejemplo, la extensión uuid-ossp a menudo se incluye con Postgres.Dicha extensión se genera versiones 1, 3 y 4 valores y, además, un par de variantes:
    • uuid_generate_v1mc() - genera un UUID versión 1, pero utiliza una dirección MAC de multidifusión al azar en lugar de la verdadera dirección MAC del ordenador.
    • uuid_generate_v5(namespace uuid, name text) - genera un UUID de versión 5, que funciona como un UUID de versión 3, excepto que SHA-1 se utiliza como método de hash.
  • servicio web
    Por ejemplo, UUID Generator crea versiones 1 & 3, así como nil values y GUID.
+2

. Querido Down- Votantes: por favor, dejen una crítica junto con su voto. Me gustaría saber qué está mal con esta respuesta, especialmente porque he utilizado las tres soluciones sugeridas con éxito en mis propias aplicaciones Java. –

+0

No he votado negativamente, pero tengo algunos problemas con su respuesta: en primer lugar, ya se ha demostrado que es incorrecto que solo pueda obtener V4 de la biblioteca Java estándar (V3 también es posible). En segundo lugar, lo hace parecer que no hay opciones en Java además de la biblioteca estándar, junto con un ondulado de la mano "debido a problemas de seguridad". Y, por último, generalmente es ineficiente (programación y/o rendimiento) para comenzar dependiendo de fuentes externas cuando hay muchas formas de hacerlo dentro de Java (a menos que lo necesites en esas, por supuesto, por ejemplo, como parte de la creación de un grabar en el servidor SQL). –

8

Sólo 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(); 
     String randomUUIDString = uuid.toString(); 
     System.out.println("UUID=" + randomUUIDString); 
    } 
} 
+2

Estimado votante de baja categoría ¿podría dar más detalles sobre lo que está mal con mi respuesta? –

-2

Usted puede utilizar este código para generar GUID.

import java.util.concurrent.TimeUnit; 

import org.apache.log4j.Logger; 

public class StrictMicroSecondTimeBasedGuid 
{ 
    private final static Logger logger = Logger 
      .getLogger(StrictMicroSecondTimeBasedGuid.class); 

    private static final long MICRO_IN_MILL = 1000; 
    private static final long NANO_IN_MICRO = 1000; 

    private static long baseNanoTime; 
    private static long baseTimeInMicro; 
    private static long lastGuid; 

    static 
    { 
     /* 
     * Nanosecond time's reference is not known, therfore following logic is 
     * needed to calculate time in micro without knowing refrence point of 
     * nano time* 
     */ 
     baseNanoTime = System.nanoTime(); 
     baseTimeInMicro = System.currentTimeMillis() * MICRO_IN_MILL; 
     lastGuid = baseTimeInMicro; 
    } 

    public static synchronized Long newGuid() 
    { 
     long newGuid; 

     while ((newGuid = calNewTimeInMicro()) <= lastGuid) 
     { 
      /** we have to check for this log, we don't want to see log. */ 

      logger.debug("wait of 10-microsecond is introduced to get new guid"); 

      try 
      { 
       TimeUnit.MICROSECONDS.sleep(10); 
      } catch (InterruptedException e) 
      { 
       logger.error("Error", e); 
      } 
     } 

     lastGuid = newGuid; 
     return newGuid; 
    } 

    private static long calNewTimeInMicro() 
    { 
     return baseTimeInMicro 
       + ((System.nanoTime() - baseNanoTime)/NANO_IN_MICRO); 
    } 
}