
Um Identificador Universalmente Único (UUID) é um rótulo de 128 bits usado em sistemas de computador para identificar informações de maneira exclusiva. Os UUIDs são projetados para serem únicos no espaço e no tempo, permitindo que sejam gerados de forma independente, sem uma autoridade central, minimizando o risco de duplicação.
UUIDs servem a vários propósitos, incluindo:
- Identificação de registros em bancos de dados.
- Marcação de objetos em sistemas distribuídos.
- Servindo como chaves primárias em aplicações onde a exclusividade é crítica.
Casos de uso do mundo real
-
Bancos de dados: UUID é usado como chave primária em bancos de dados relacionais para garantir a identificação exclusiva dos registros.
-
Microsserviços: facilitam a comunicação do serviço fornecendo identificadores exclusivos para solicitações e recursos.
-
Dispositivos IoT: identifique dispositivos exclusivamente em uma rede, garantindo que os dados de diversas fontes possam ser agregados sem conflitos.
Vantagens e desvantagens no uso de UUID
Vantagens:
-
Singularidade global: É extremamente improvável que os UUIDs colidam, tornando-os adequados para sistemas distribuídos onde vários nós geram identificadores de forma independente.
-
Não é necessária autoridade central: Eles podem ser gerados sem coordenação, o que simplifica as operações em ambientes distribuídos.
-
Escalabilidade: Eles funcionam bem em sistemas que exigem escalabilidade em vários servidores ou serviços.
Desvantagens:
-
Tamanho de armazenamento: UUIDs consomem mais espaço (128 bits) em comparação com IDs inteiros tradicionais (normalmente 32 bits), o que pode levar a maiores custos de armazenamento.
-
Problemas de desempenho: UUIDs de indexação podem degradar o desempenho do banco de dados devido à sua aleatoriedade e tamanho, levando a tempos de consulta mais lentos em comparação com IDs sequenciais.
-
Falta de amizade com o usuário: UUIDs não são facilmente memoráveis ou fáceis de usar quando apresentados em interfaces de usuário.
O Padrão
A representação padrão de um UUID consiste em 32 caracteres hexadecimais divididos em cinco grupos, separados por hífens, seguindo o formato 8-4-4-4-12, resultando em um total de 36 caracteres (32 alfanuméricos mais 4 hífens) .
O formato UUID pode ser visualizado da seguinte forma:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Onde:
-
M indica a versão do UUID.
-
N indica a variante, o que ajuda a interpretar o layout do UUID.
Componentes de um UUID
-
TimeLow: 4 bytes (8 caracteres hexadecimais) representando o campo inferior do carimbo de data/hora.
-
TimeMid: 2 bytes (4 caracteres hexadecimais) representando o campo intermediário do carimbo de data/hora.
-
TimeHighAndVersion: 2 bytes (4 caracteres hexadecimais) que incluem o número da versão e o campo alto do carimbo de data/hora.
-
ClockSequence: 2 bytes (4 caracteres hexadecimais) usados para ajudar a evitar colisões, especialmente quando vários UUIDs são gerados em rápida sucessão ou se o relógio do sistema for ajustado.
-
Nó: 6 bytes (12 caracteres hexadecimais), normalmente representando o endereço MAC do nó gerador.
Tipos de UUIDs
Versão 1: UUIDs baseados em tempo que usam uma combinação do carimbo de data/hora atual e do endereço MAC do nó gerador. Esta versão garante exclusividade no espaço e no tempo.
Versão 2: semelhante à versão 1, mas inclui identificadores de domínio local; no entanto, é menos comumente usado devido às suas limitações.
Versão 3: UUIDs baseados em nome gerados usando um hash MD5 de um identificador de namespace e um nome.
Versão 4: UUIDs gerados aleatoriamente que fornecem alta aleatoriedade e exclusividade, com apenas alguns bits reservados para controle de versão.
Versão 5: semelhante à versão 3, mas usa SHA-1 para hashing, tornando-a mais segura que a versão 3.
Variantes
O campo variante em um UUID determina seu layout e interpretação. As variantes mais comuns incluem:
-
Variante 0: Reservado para compatibilidade com versões anteriores do NCS.
-
Variante 1: O layout padrão usado para a maioria dos UUIDs.
-
Variante 2: Usado para UUIDs de segurança DCE, que são menos comuns.
-
Variante 3: Reservado para definições futuras.
Exemplo
Para Versão 4, um UUID pode ter esta aparência:
550e8400-e29b-41d4-a716-446655440000
Aqui:
-
41d4 indica que é uma versão 4.
-
a7 representa a variante, neste caso, a variante comum "Leach-Salz".
Como os UUIDs são calculados
-
Versão 1 (com base no tempo):
- O carimbo de data/hora normalmente é o número de intervalos de 100 nanossegundos desde 15 de outubro de 1582 (a data da reforma do calendário gregoriano).
- O nó é o endereço MAC da máquina que gera o UUID.
- A sequência do relógio ajuda a garantir a exclusividade quando a hora do relógio muda (por exemplo, devido a reinicializações do sistema).
-
Versão 3 e Versão 5 (baseada em nome):
- Um namespace (como um domínio DNS) é combinado com um nome (como um caminho de arquivo ou URL) e hash.
- O hash (MD5 para a versão 3, SHA-1 para a versão 5) é então estruturado em um formato UUID, garantindo que os campos de versão e variante sejam definidos corretamente.
-
Versão 4 (baseado em aleatório):
- Números aleatórios ou pseudo-aleatórios são gerados para os 122 bits do UUID.
- Os campos de versão e variante são definidos de acordo, garantindo a conformidade com os padrões UUID.
Exemplo de cálculo UUIDv4
Etapa 1: Gere 128 bits aleatórios
Vamos supor que geramos o seguinte valor aleatório de 128 bits:
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
Etapa 2: Aplicar versão e variante UUIDv4
Versão: Substitua os bits 12-15 (4º caractere) por 0100 (para UUID versão 4).
Original: 1100 passa a 0100 → Valor atualizado nesta posição.
Variante: Substitua os bits 6-7 do 9º byte por 10 (para a variante RFC 4122).
Original: 11 vira 10 → Valor atualizado nesta posição.
Etapa 3: Formatar em hexadecimal
Converta o binário de 128 bits em 5 grupos hexadecimais:
- grupo de 32 bits: 11001100110101101101010101111010 → ccda55ba
- grupo de 16 bits: 1011101101101110 → b76e
- grupo de 16 bits: 0100010101000101 → 4545 (com 0100 para versão 4)
- grupo de 16 bits: 1010110111110010 → adf2 (com 10 para a variante)
- grupo de 48 bits: 11010011011110100100101111001011 → d39d25cb
Etapa 4: Combine os grupos
O UUID final ficaria assim:
ccda55ba-b76e-4545-adf2-d39d25cb