Volver |

UUID

Introducción

Un UUID es un identificador de 16 bytes, es decir, 128 bits (16 * 8 = 128). Estos identificadores se generan a través de un algoritmo, el cual está especificado por el IETF en el RFC 4122 [https://tools.ietf.org/html/rfc4122]. Una característica valiosa de los UUID es que no se requiere una autoridad central que los administre, es decir, se pueden generar sin pedirle a alguien más que lo haga. La probabilidad de unicidad de los UUID generados se aproximan al 100% pero no la alcanza, esto puede variar de acuerdo a la versión utilizada. En el estándar 4122 se especifican 5 versiones aunque en febrero de 2020 se propuso un borrador de una sexta versión [https://tools.ietf.org/html/draft-peabody-dispatch-new-uuid-format-00], la cual no profundizaremos en estas notas. Normalmente, los uuid se representan en base hexadecimal. Por ejemplo si el UUID fuera el siguiente (una secuencia de 16 bytes):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
45 103 19 74 60 69 77 9 177 233 106 197 55 20 37 37

 

La representación en base hexadecimal sería:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2d 67 13 4a 3c 45 4d 09 b1 e9 6a c5 37 14 25 25

 

El estándar define una representación en string que básicamente consiste en separar la representación hexadecimal a través de guiones. Es decir, partiendo de su representación hexadecimal: 2d67134a3c454d09b1e96ac539142525

Se obtiene lo siguiente: 2d67134a-3c45-4d09-b1e9-6ac539142525

Como se puede apreciar, se divide el UUID en 8-4-4-4-12 caracteres. Por lo tanto, y como conclusión, en ASCII un UUID está compuesto por una quíntupla de:

  • Ocho bytes.
  • Cuatro bytes.
  • Cuatro bytes.
  • Cuatro bytes.
  • Doce bytes.

Lo que da un total de 32 bytes. Si le sumamos los 4 bytes de los guiones separadores, se llega a un total de 36 bytes. Es importante notar que en su representación binaria, un UUID está compuesto por 16 bytes. Sin embargo, al convertirlo a la representación en String se compone de 36 bytes.  

Generar UUID en MySQL

En MySQL se puede usar la función uuid() que retorna un UUID de 36 bytes. Para almacenarlo en 16 bytes se puede usar las siguientes funciones:

unhex(replace(uuid(),"-","")

Para obtener un UUID en formato human-readable se puede crear una columna virtual, por ejemplo:

CREATE TABLE test_uuid (
    binary_id BINARY(16),
    text_id VARCHAR(36) GENERATED ALWAYS AS
    (insert(
        insert(
            insert(
                    insert(hex(binary_id),9,0,"-"),
                14,0,"-"),
            19,0,"-"),
        24,0,"-")
    ) VIRTUAL
)

Referencias:

https://mysqlserverteam.com/storing-uuid-values-in-mysql-tables/

En este artículo participaron: