Crear un GUID en Java

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

Sí, yo creo que necesitamos más cosas sencillas como esta en Stackoverflow así. Sé que se benefician de manera significativa. El problema es que la gente se «flameado» un lote para la publicación de preguntas sencillas, que son motor de búsqueda amigable para las personas que ya saben la respuesta y creo que la pregunta es demasiado simple. Yo hago lo que usted acaba de hacer, cuando veo a una pregunta simple, que la gente no le gusta, me comentario en apoyo de la pregunta. En este caso, su fresco que la pregunta estaba cerrado, porque aunque la gente de la búsqueda para «GUID Java» va a encontrar y, a continuación, ser capaz de ver las respuestas a ambas preguntas.
La pregunta en stackoverflow.com/questions/325443/generate-uuid-in-java se acerca más a la GUID de colisiones, a continuación, sólo que lo que el equivalente de un GUID es el Java de tecnología de la pila, que es lo que (creo) es más que el enfoque de esta cuestión.

OriginalEl autor Chris Dutrow | 2010-06-06

6 Kommentare

  1. 286

    Tener una mirada en el UUID de la clase liado con Java 5 y posteriores.

    Por ejemplo:

    Si se incluye un ejemplo como Kaleb Brasee hizo, su buena respuesta sería aún mejor.
    Trabaja en AndroidStudio 2.3 y en la API de los niveles de 21 y más allá, al menos. Tal vez más atrás.
    TL;DR… » UUID uuid = UUID.randomUUID(); «

    OriginalEl autor Mark Byers

  2. 345

    java.util.UUID.randomUUID();

    Mientras que el brainacs por encima de escritura de tesis doctorales sobre la calidad o el contenido de la pregunta, o dar varios enlaces para la lectura prolongada en el concepto de un GUID, esta respuesta da 4 palabras, de 3 períodos, y abrir y cerrar el paréntesis. Bravo Kaleb.
    Sí, es teóricamente posible que el UUID.randomUUID método para devolver un duplicado, pero esto es no es en absoluto una preocupación realista. El Oracle/OpenJDK aplicación utiliza un sistema de encriptación fuerte generador de números aleatorios. Dado que, y dada la astronómico rango de de tantos bits en un UUID, puede generar muchos millones de tales valores en su aplicación y seguir dormir bien. El uso de una de las otras variantes reduce aún más la posibilidad de colisiones aún más cerca de cero, porque de uso de «espacio y tiempo», [1] dirección MAC o el nombre, y [2] fecha actual-tiempo, como las restricciones.
    Eh, si estás tan paranoico, y usted tiene acceso a la lista de los ya utilizados Id a la hora de crear uno nuevo, que acaba de generar nuevos de while hasta que tienes uno que no está dentro de la lista :p
    El Oráculo de crypto generador de números aleatorios es típicamente un PRNG con una semilla aleatoria. La semilla aleatoria normalmente se obtiene usando una fuente de «entropía» proporcionado por el sistema operativo. Si usted puede degradar o compromiso que la fuente, entonces la probabilidad de un cripto generador de números aleatorios que produce el mismo número se incrementa. También vale la pena señalar que en algunos de ellos (por ejemplo, virtualizado) las plataformas, el sistema operativo puede ejecutar fuera de la entropía. Hay «chunga hacks» para solucionar esto, pero que implica degradar la calidad de la entropía.
    Esto no es sólo una preocupación académica. He visto una (no verificada !!) afirman que alguien ¿ problemas con el azar basado en los Uuid no ser única.

    OriginalEl autor Kaleb Brasee

  3. 30

    Depende de qué tipo de UUID desea.

    • El estándar de Java UUID se genera la clase La versión 4 (al azar) Uuid. (ACTUALIZACIÓNLa versión 3 (nombre) Uuid también puede ser generado.) También pueden manejar otras variantes, a pesar de que no se puede generar. (En este caso, «asa» significa construir UUID instancias de long, byte[] o String representaciones, y proporcionar unas adecuadas descriptores de acceso.)

    • La Java UUID del Generador (JUG) aplicación pretende apoyar «a los 3 ‘oficial’ tipos de UUID como se define por RFC 4122» … aunque el RFC define 4 tipos, y se menciona una 5ª tipo.

    Para obtener más información sobre UUID tipos y variantes, hay un buen resumen en Wikipedia, y los detalles escabrosos son en RFC 4122 y las otras especificaciones.

    No es totalmente cierto, también puede generar basado en el nombre (versión 3) Uuid con UUID.nameUUIDFromBytes(byte[] name)
    Acepto la corrección. Me basé en el javadoc descripción que dice: «Estático de fábrica para recuperar tipo 3 (basado en el nombre) UUID basado en el conjunto de bytes especificado. «
    No creo que el post es exacta. El UUID Java docs del estado el constructor genera un tipo de variante 2, no al azar. Para el tipo 3 uso public static UUID nameUUIDFromBytes(byte[] name). para el tipo 4 uso public static UUID randomUUID(). Tipo 1 no está disponible con el JDK de clase.
    No. Yo creo que lo tengo bastante a la derecha. Los javadocs estado: «a pesar de que los constructores permiten la creación de cualquier variante de UUID (descrito a continuación).» y 4 variantes se indican a continuación, incluidos los de tipo 1. De hecho, leer el javadoc de clockSequence()

    OriginalEl autor Stephen C

  4. 13

    Sólo para extender Mark Byers la respuesta 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 );
        }
    }

    OriginalEl autor Anton Belev

  5. 6

    Las otras Respuestas son correctas, especialmente este por Stephen C.

    Llegar Fuera De Java

    La generación de un UUID valor dentro de Java se limita a La versión 4 (al azar) debido a preocupaciones de seguridad.

    Si quieres que el resto de versiones de los Uuid, una avenida es tener tu aplicación Java llegar fuera del JVM para generar Uuid llamando en:

    • Utilidad de línea de comandos
      Liado con casi todos los sistemas operativos.
      Por ejemplo, uuidgen encontrado en Mac OS X, BSD y Linux.
    • Servidor de base de datos
      Uso JDBC para recuperar un UUID generado en el servidor de base de datos.
      Por ejemplo, el uuid-ossp extensión a menudo viene incluido con Postgres. Que la extensión puede genera Versiones 1, 3, y 4 los valores y, además, un par de variaciones:
      • uuid_generate_v1mc() – genera una versión 1 UUID, pero usa un aleatoria dirección MAC de multidifusión en lugar de la verdadera dirección MAC de la computadora.
      • uuid_generate_v5(namespace uuid, name text) – genera una versión de 5 UUID, la cual funciona como una versión 3 UUID excepto que SHA-1 se utiliza como un método de hashing.
    • Servicio Web
      Por ejemplo, UUID Generador crea Versiones 1 & 3 así como nil valores y GUID.
    Queridos Abajo-Votantes: por Favor, deje una crítica a lo largo de con su voto. Me gustaría saber lo que está mal con esta respuesta, sobre todo porque he usado los tres soluciones sugeridas con éxito en mis propias aplicaciones Java.
    Yo no downvote, pero tengo algunos problemas con su respuesta: en Primer lugar, ya estaba demostrado ser errónea de que sólo se puede obtener V4 desde el estándar de la biblioteca de Java (V3 también es posible). En segundo lugar, hacen que suene como que no hay opciones dentro de Java, además de la biblioteca estándar, junto con una mano-ondulado «debido a preocupaciones de seguridad». Y por último, es generalmente ineficaz (programación y/o en cuanto al rendimiento) para iniciar dependiendo de las fuentes externas cuando hay un montón de maneras de hacerlo dentro de Java (si no lo necesita en los que, por supuesto, por ejemplo, como parte de la creación de un registro en el servidor de SQL server).

    OriginalEl autor Basil Bourque

  6. -1

    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);
        }
    }

    OriginalEl autor user2044181

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein