JUG es un conjunto de clases de Java para trabajar con UUID: generar UUID utilizando cualquiera de los métodos estándar, generar salida eficiente, ordenar, etc. Genera UUID de acuerdo con la especificación UUID (RFC-4122) (consulte la página UUID de Wikipedia para obtener más explicaciones)
JUG fue escrito por Tatu Saloranta ([email protected]) originalmente en 2002 y se ha actualizado a lo largo de los años. Además, muchas otras personas han ayudado a corregir errores e implementar nuevas funciones: consulte release-notes/CREDITS
para obtener la lista completa.
JUG tiene la licencia Apache 2.0.
JUG admite ambas versiones "clásicas" definidas en RFC 4122]:
1
: hora/ubicación - basado3
y 5
: nombre basado en hash4
: basado en números aleatoriosy variantes propuestas recientemente (en 2022-2024) (ver uuid6 y RFC-4122 bis):
6
: variante reordenada de la versión 1
(con orden lexicográfico)7
: marca de tiempo Unix + variante aleatoria (también con orden lexicográfico) Tipo | Estado |
---|---|
Construir (CI) | |
Artefacto | |
Patrocinio de OSS | |
Javadocs | |
Cobertura de código (5.x) | |
Puntuación OpenSSF |
JUG se puede utilizar como herramienta de línea de comandos (a través de la clase com.fasterxml.uuid.Jug
) o como componente conectable.
Las coordenadas de Maven son:
< dependency >
< groupId >com.fasterxml.uuid</ groupId >
< artifactId >java-uuid-generator</ artifactId >
< version >5.1.0</ version >
</ dependency >
Gradle:
implementation ' com.fasterxml.uuid:java-uuid-generator:5.1.0 '
La única dependencia de JUG es la biblioteca de registro:
log4j
, opcionalmente (dependencia del tiempo de ejecución)slf4j
: la implementación de registro se proporcionará llamando a la aplicación Desde la versión 3.2.0
, JUG define module-info.class
compatible con JDK9+, con el nombre del módulo com.fasterxml.uuid
.
Para descargas directas, consulte Project Wiki.
El caso de uso original de JUG fue la generación de valores UUID. Esto se hace seleccionando primero un tipo de generador a usar y luego llamando a su método generate()
. Por ejemplo:
UUID uuid = Generators . timeBasedGenerator (). generate (); // Version 1
UUID uuid = Generators . randomBasedGenerator (). generate (); // Version 4
UUID uuid = Generators . nameBasedgenerator (). generate ( "string to hash" ); // Version 5
// With JUG 4.1+: support for https://github.com/uuid6/uuid6-ietf-draft versions 6 and 7:
UUID uuid = Generators . timeBasedReorderedGenerator (). generate (); // Version 6
UUID uuid = Generators . timeBasedEpochGenerator (). generate (); // Version 7
// With JUG 5.0 added variation:
UUID uuid = Generators . timeBasedEpochRandomGenerator (). generate (); // Version 7 with per-call random values
Si desea personalizar los generadores, es posible que también desee conservar la instancia del generador:
TimeBasedGenerator gen = Generators . timeBasedGenerator ( EthernetAddress . fromInterface ());
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Si su máquina tiene una configuración de red IP estándar, el método de fábrica Generators.defaultTimeBasedGenerator
(agregado en JUG 4.2) intentará determinar qué interfaz de red corresponde a la ruta predeterminada para todo el tráfico de red saliente y la usará para crear un generador basado en tiempo. Probablemente esta sea una buena opción para escenarios de uso comunes si desea un generador de UUID versión 1.
TimeBasedGenerator gen = Generators . defaultTimeBasedGenerator ();
UUID uuid = gen . generate ();
UUID anotherUuid = gen . generate ();
Los generadores son totalmente seguros para subprocesos, por lo que una única instancia se puede compartir entre varios subprocesos.
Los Javadocs para obtener más información se pueden encontrar en Project Wiki.
java.util.UUID
en bytes [] A veces es posible que desee convertir de java.util.UUID
a serialización externa: por ejemplo, como String
s o matrices de bytes ( byte[]
). La conversión a String
es fácil con UUID.toString()
(proporcionado por JDK), pero no existe una funcionalidad similar para convertir a byte[]
.
Pero la clase UUIDUtil
proporciona métodos para conversiones eficientes:
byte[] asBytes = UUIDUtil.asByteArray(uuid);
// or if you have longer buffer already
byte[] outputBuffer = new byte[1000];
// append at position #100
UUIDUtil.toByteArray(uuid, outputBuffer, 100);
java.util.UUID
a partir de String, byte[] Los valores UUID
a menudo se pasan como java String
s o byte[]
s (matrices de bytes), y se necesita conversión para llegar a instancias java.util.UUID
reales. JUG tiene una funcionalidad de conversión optimizada disponible a través de la clase UUIDUtil
(paquete com.fasterxml.uuid.impl
), que se utiliza de la siguiente manera:
UUID uuidFromStr = UUIDUtil.uuid("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
byte[] rawUuidBytes = ...; // byte array with 16 bytes
UUID uuidFromBytes = UUIDUtil.uuid(rawUuidBytes)
Tenga en cuenta que, si bien JDK tiene funcionalidad para construir UUID
a partir de String
, así:
UUID uuidFromStr = UUID.fromString("ebb8e8fe-b1b1-11d7-8adb-00b0d078fa18");
es bastante más lento que la versión JUG: para obtener más información, lea Medición del rendimiento de Java UUID.fromString().
Jarra JUG construida bajo target/
:
target/java-uuid-generator-5.1.0-SNAPSHOT.jar
También se puede utilizar como una sencilla herramienta de generación de UUID de línea de comandos.
Para ver el uso puedes hacer algo como:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar
y obtener instrucciones completas, pero para generar 5 UUID aleatorios, usaría:
java -jar target/java-uuid-generator-5.1.0-SNAPSHOT.jar -c 5 r
(donde -c
(o --count
) significa la cantidad de UUID que se generarán y r
significa la versión aleatoria)
NOTA: esta funcionalidad se incluye a partir de JUG 4.1; con versiones anteriores necesitaría una invocación un poco más larga ya que los metadatos de Jar no especificaban "Clase principal". Si es así, necesitarías usar
java -cp target/java-uuid-generator-5.1.0-SNAPSHOT.jar com.fasterxml.uuid.Jug -c 5 r
Las versiones 3.1 y posteriores de JUG requieren JDK 1.6 para funcionar, principalmente para poder acceder a la dirección MAC Ethernet local. Las versiones anteriores (3.0 y anteriores) funcionaban en 1.4 (que introdujo java.util.UUID
).
Las versiones JUG 5.0 y posteriores requieren JDK 8 para funcionar.
java.util.UUID
de JDK tiene una implementación defectuosa de compareTo()
, que utiliza una comparación ingenua de valores de 64 bits. Esto NO funciona como se esperaba, dado que el contenido subyacente no está firmado a todos los efectos. Por ejemplo, dos UUID:
7f905a0b-bb6e-11e3-9e8f-000000000000
8028f08c-bb6e-11e3-9e8f-000000000000
se ordenaría con el segundo primero, debido a la extensión del signo (el segundo valor se considera negativo y, por lo tanto, "más pequeño").
Debido a esto, siempre debe usar un comparador externo, como com.fasterxml.uuid.UUIDComparator
, que implementa el orden de clasificación esperado, que es una clasificación simple sin signo, que también es lo mismo que la clasificación lexicográfica (alfabética) de los UUID (cuando se supone un uso de mayúsculas uniforme). .
Disponible como parte de la suscripción Tidelift.
Los mantenedores de java-uuid-generator
y miles de otros paquetes están trabajando con Tidelift para brindar soporte comercial y mantenimiento para las dependencias de código abierto que utiliza para crear sus aplicaciones. Ahorre tiempo, reduzca el riesgo y mejore la salud del código, mientras paga a los mantenedores de las dependencias exactas que utiliza. Obtenga más información.
Para obtener informes y correcciones de errores sencillos, y solicitudes de funciones, simplemente utilice el Rastreador de problemas de proyectos, con excepción de los problemas relacionados con la seguridad para los cuales recomendamos presentar el contacto de seguridad de Tidelift (NOTA: NO es necesario estar suscrito para hacer esto).
Hay muchos otros generadores de UUID disponibles públicamente. Por ejemplo:
java.util.UUID
desde 1.4, pero omite los métodos de generación (especialmente los basados en tiempo/ubicación), tiene un rendimiento inferior al estándar para muchas operaciones e implementa la comparación de manera inútilTenga en cuenta que, aunque algunos paquetes afirman ser más rápidos que otros, no está claro:
por lo que suele ser mejor elegir en función de la estabilidad de los paquetes y la API.