UUID ( Identificador único universal en inglés "Universal Unique Identifier") es un estándar de identificación utilizado en el desarrollo de software , estandarizado por Open Software Foundation (OSF) como parte de DCE - Distributed Computing Environment . El objetivo principal de UUID es permitir que los sistemas distribuidos identifiquen información de manera única sin una cámara de compensación. Por lo tanto, cualquiera puede crear un UUID y usarlo para identificar algo con un nivel razonable de confianza de que el identificador dado, sin darse cuenta, nunca se usará para otra cosa. Por lo tanto, la información etiquetada con un UUID se puede colocar más tarde en una base de datos compartida sin necesidad de resolver conflictos de nombres. El uso más común de este estándar es el identificador único global ( GUID ) de Microsoft . Otros usuarios importantes son Linux (sistema de archivos ext2 / ext3 , particiones cifradas LUKS , GNOME , KDE ) y Mac OS X , todos los cuales usan una implementación derivada de la biblioteca uuid que se encuentra en el paquete e2fsprogs.
El UUID está documentado como parte de ISO / IEC 11578:1996 " Tecnología de la información - Interconexión de sistemas abiertos - Llamada a procedimiento remoto (RPC)" y posteriormente en la Rec. ITU-T. X.667 | ISO / IEC 9834-8:2008. El IETF ha publicado un estándar propuesto , RFC 4122 , que es técnicamente idéntico a la Rec. ITU-T. X.667 | ISO/CEI 9834-8.
El UUID es un número de 16 bytes (128 bits ). En su representación canónica, un UUID se representa como un número hexadecimal separado por guiones en cinco grupos en el formato 8-4-4-4-12. Esta representación toma 36 caracteres:
123e4567-e89b-12d3-a456-426655440000 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxLos 4 bits Mindican la versión ("versión") del UUID, y los 1-3 bits más significativos Nindican la variante ("variante") del UUID.
Esta agrupación se basa en la estructura UUID:
Nombre del campo | Longitud (en bytes) | Longitud (número de dígitos hexadecimales) | Contenido |
---|---|---|---|
tiempo_bajo | cuatro | ocho | un número entero que denota los 32 bits inferiores del tiempo |
hora_media | 2 | cuatro | un número entero que denota el promedio de 16 bits de tiempo |
time_hi_and_version | 2 | cuatro | Los 4 bits más significativos indican la versión del UUID, los bits menos significativos indican los 12 bits más significativos del tiempo |
clock_seq_hi_and_res clock_seq_low | 2 | cuatro | 1-3 bits altos indican la variante UUID, los 13-15 bits restantes indican la secuencia del reloj |
nodo | 6 | 12 | Id. de host de 48 bits |
Estos campos corresponden a las versiones 1 y 2 de UUID, que se generan en función del tiempo, pero la representación 8-4-4-4-12 se usa para cualquier versión de UUID.
RFC 4122 también define un espacio de nombres URN para UUID:
urn:uuid:123e4567-e89b-12d3-a456-426655440000El GUID de Microsoft a veces se usa con llaves:
{123e4567-e89b-12d3-a456-426655440000}El número total de claves UUID únicas (excluyendo versiones) es 2128 = 25616 o alrededor de 3,4 × 1038 . Esto significa que al generar 1 billón de claves cada nanosegundo , tomará solo 10 mil millones de años clasificar todos los valores posibles.
Un UUID con un identificador especial se puede reutilizar intencionalmente para identificar la misma entidad en diferentes contextos. Por ejemplo, en el Modelo de objetos de componentes de Microsoft , cada componente debe admitir la interfaz estándar " IUnknown ". Para ello, se crea un UUID que representa " IUnknown ". En todos los casos en los que se utiliza " IUnknown ", al acceder a procesos a la interfaz " IUnknown " en el componente, o para implementar soporte para la interfaz " IUnknown " por parte del propio componente, siempre se hace referencia al mismo identificador: . 00000000-0000-0000-C000-000000000046
La representación binaria de un UUID varía en diferentes sistemas.
La mayoría de los sistemas codifican el UUID completamente en big-endian . Por ejemplo, 00112233-4455-6677-8899-aabbccddeeffcodificado en bytes 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff.
Algunos sistemas, como el cálculo de referencias en las bibliotecas COM/OLE de Microsoft , usan mixed-endian , donde los tres primeros componentes del UUID se codifican como little-endian y los dos últimos como big-endian. Por ejemplo, 00112233-4455-6677-8899-aabbccddeeffen este caso está codificado como 33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff.
Por razones históricas, el UUID tiene varias variantes, denotadas por uno, dos o tres bits.
Una de las opciones definidas en RFC 4122 , la opción 0 (indicada por un solo bit 0xxx 2 , N = 0..7), está presente para la compatibilidad con versiones anteriores del obsoleto formato UUID Apollo Network Computing System 1.5 desarrollado alrededor de 1988. En este formato, los primeros 6 octetos del UUID son una marca de tiempo de 48 bits (la cantidad de unidades de tiempo de 4 microsegundos que han transcurrido desde el 1 de enero de 1980 UTC); los siguientes 2 octetos están reservados; el siguiente octeto es "familia de direcciones"; los últimos 7 octetos son el ID de host de 56 bits en el formato especificado por la familia de direcciones. A pesar de la diferencia en los detalles, se puede ver la similitud con el UUID moderno de la versión 1. Los bits variantes en la especificación UUID actual son los mismos que los bits altos del octeto de la familia de direcciones en el UUID NCS. Aunque una familia de direcciones puede contener valores en el rango 0..255, solo se han definido los valores 0..13. Por lo tanto, designar la opción 0 como 0xxxevita conflictos con los UUID NCS históricos si aún existen en las bases de datos.
Estas variantes se utilizan en las especificaciones UUID actuales. La opción 1 (indicada por dos bits 10xx 2 N = 8..b) es la principal y se describe en RFC 4122 . La opción 2 (indicada por los tres bits 110x 2 N = c..d) se describe en el RFC como reservada para la compatibilidad con versiones anteriores de los primeros GUID de Microsoft Windows .
Aparte de los bits variantes, los dos UUID son iguales, excepto que cuando se codifican en forma binaria para el almacenamiento o la transmisión, los UUID de la variante 1 usan el orden de bytes de red (big-endian), mientras que los GUID de la variante 2 usan el orden de bytes nativo. -endian) orden de bytes. En la representación textual canónica, las opciones 1 y 2 son las mismas excepto por los bits de opción.
Si bien algunos GUID importantes, como el identificador de interfaz IUnknown para COM, son UUID de variante 2, muchos de los identificadores creados y utilizados en el software de Microsoft Windows y denominados "GUID" son, de hecho, UUID de variante 1 estándar en orden de bytes de red. La versión actual de la utilidad de Microsoft guidgengenera UUID de variante estándar 1. Cierta documentación de Microsoft dice que "GUID" es un sinónimo de "UUID", [1] según lo estandarizado en RFC 4122 . El propio RFC 4122 establece que los UUID también se conocen como GUID ("también se conocen como GUID"). Todo esto sugiere que "GUID", aunque originalmente era una variante separada del UUID utilizado por Microsoft, ahora se ha convertido en un nombre alternativo para el UUID estándar.
En RFC 4122 , 111x 2 ( N = e..f) está reservado para uso futuro.
El estándar define cinco versiones ("versión") de UUID, cada una de las cuales puede ser mejor o peor en ciertas situaciones.
Un caso especial en el que todos los bits de UUID se establecen en cero: 00000000-0000-0000-0000-000000000000.
La versión 1 incluye la dirección MAC de 48 bits del nodo ("nodo") en el que se generó el UUID y una marca de tiempo de 60 bits (marca de tiempo) que indica la cantidad de intervalos de 100 ns que han transcurrido desde la medianoche del 15 de octubre. 1582 UTC: fecha de inicio del uso del calendario gregoriano . RFC 4122 especifica un tiempo máximo posible alrededor de 3400 CE. ej., lo que significa que la marca de tiempo de 60 bits está firmada. Sin embargo, algunos programas, como la biblioteca libuuid, consideran que la marca de tiempo no está firmada [2] y, para ellos, el tiempo máximo es alrededor de 5236 CE. mi.
Una secuencia de reloj de 13 o 14 bits rellena la marca de tiempo en los casos en que el reloj del sistema no se actualiza lo suficientemente rápido o en sistemas multiprocesador. En tales casos, diferentes UUID pueden tener la misma marca de tiempo. Para evitar generar los mismos UUID, se utiliza una secuencia de reloj, que se actualiza cada vez que se crea un nuevo UUID, y que será diferente para diferentes UUID incluso si las marcas de tiempo coinciden. Debido a que los UUID de la versión 1 corresponden a un solo punto en el espacio (nodo) y el tiempo (marca de tiempo y secuencia de reloj), la posibilidad de que dos UUID generados correctamente coincidan es prácticamente nula. Dado que la marca de tiempo y la secuencia de reloj juntas son de 74 bits, se puede generar un total de 2 74 (1.8⋅10 22 , o 18 sextillones ) de UUID únicos de la versión 1 en un solo nodo a una tasa promedio máxima de 163 mil millones de UUID por segundo.
A diferencia de otras versiones de UUID, la unicidad de la versión 1 y la versión 2 de los UUID basados en direcciones NIC MAC depende en parte de un identificador emitido por una autoridad de registro central, a saber, el Identificador único de la organización (OUI) parte de la dirección MAC, que se emite por los fabricantes de equipos de red IEEE . [3] La exclusividad también depende de la asignación correcta de direcciones MAC únicas por parte de los fabricantes de NIC que, al igual que otros procesos de fabricación, es propenso a errores.
El uso de la dirección MAC significa que siempre puede rastrear la computadora que creó el UUID. A veces es posible encontrar la computadora en la que se creó o editó un documento si el procesador de textos que se utiliza tiene el UUID incrustado en el archivo. Este agujero de privacidad se utilizó para encontrar al autor del virus Melissa . [cuatro]
RFC 4122 reserva la versión 2 "seguridad DCE" pero no proporciona ningún detalle al respecto. Por esta razón, muchas implementaciones de UUID no tienen la versión 2. Sin embargo, el UUID de la versión 2 se describe en la especificación de servicios de seguridad y autenticación DCE 1.1. [5]
La versión 2 es similar a la versión 1, pero los 8 bits inferiores de la secuencia del reloj se reemplazan con un número de "dominio local" y los 32 bits inferiores de la marca de tiempo se reemplazan con un identificador entero que es significativo dentro del dominio local especificado.
La capacidad de incluir un dominio/identificador de 40 bits es un compromiso. Por un lado, 40 bits permiten alrededor de 1 billón de valores de dominio/identificador para un solo nodo. Por otro lado, con la marca de tiempo recortada a 28 MSB de 60 bits en la versión 1, la versión 2 de UUID solo marcará el tiempo cada 429,49 segundos (un poco más de 7 minutos), en lugar de 100 nanosegundos en la versión 1. Y con el 6 -secuencia de reloj de bits, a diferencia de los 14 bits en la versión 1, solo se pueden generar 64 UUID únicos para un solo host/dominio/id durante esos 7 minutos. Por lo tanto, la versión 2 de UUID no es adecuada si desea generar un UUID más de una vez cada 7 minutos.
Los UUID de las versiones 3 y 5 se generan mediante el hash de un identificador de espacio de nombres y un nombre. La versión 3 usa el algoritmo hash MD5 , la versión 5 usa SHA-1 .
La especificación proporciona un UUID para representar la URL , el FQDN, el OID y los espacios de nombres de nombres distinguidos X.500 , pero se puede usar cualquier UUID deseado como identificador de espacio de nombres.
Para calcular el UUID de la versión 3 correspondiente a un espacio de nombres y un nombre determinados, el UUID del espacio de nombres se convierte en un byte, se concatena con el nombre y se procesa con el algoritmo MD5, lo que da como resultado 128 bits. Luego, los 6 o 7 bits se reemplazan con valores fijos: una versión de 4 bits (por ejemplo, 0011 2 para la versión 3) y una variante de 2 o 3 bits del UUID (por ejemplo, 10 2 , que significa RFC 4122 UUID, o 110 2 , que indica el GUID heredado de Microsoft). Dado que se predefinen 6 o 7 bits, solo 121 o 122 bits contribuyen a la unicidad del UUID.
El UUID de la versión 5 es similar pero usa SHA-1 en lugar de MD5. Dado que SHA-1 proporciona un hash de 160 bits, se trunca previamente a 128 bits.
La esencia de las versiones 3 y 5 de UUID es que el mismo par del espacio de nombres y el nombre se asignará al mismo UUID. En este caso, ni el espacio de nombres ni el nombre se pueden recuperar del UUID, excepto por fuerza bruta.
RFC 4122 recomienda usar la versión 5 en lugar de la versión 3 y no recomienda usar ninguna de las versiones como credencial de seguridad.
El UUID de la versión 4 se genera aleatoriamente. Al igual que con otras versiones del UUID, se utilizan 4 bits para indicar la versión, 2 o 3 bits indican la variante. Entonces, para la variante 1 (que es utilizada por la mayoría de los UUID), hay 122 bits por parte generada aleatoriamente, lo que da 2122, o 5.3⋅10 36 (5.3 undecillones ) posibles UUID de la versión 4 de la variante 1. UUID de la versión 4 de la variante 2 tiene la mitad de opciones posibles, ya que se usa un bit más para designar una variante.