Whiz Tools

Gerador de UUID

UUID Gerado

Estrutura do UUID
Baixo do tempo

Gerador de UUID

Introdução

Um Identificador Único Universal (UUID) é um número de 128 bits usado para identificar informações em sistemas de computador. Os UUIDs são padronizados pela Open Software Foundation (OSF) como parte do Ambiente de Computação Distribuída (DCE). Esses identificadores são projetados para serem únicos tanto no espaço quanto no tempo, tornando-os ideais para várias aplicações em sistemas distribuídos e além.

Esta ferramenta geradora de UUID permite que você crie tanto UUIDs da versão 1 (baseados em tempo) quanto da versão 4 (aleatórios). Esses identificadores são úteis em vários cenários onde identificação única é necessária, como chaves de banco de dados, sistemas distribuídos e protocolos de rede.

Como os UUIDs Funcionam

Estrutura do UUID

Um UUID é tipicamente representado como 32 dígitos hexadecimais, exibidos em cinco grupos separados por hífens, na forma 8-4-4-4-12, totalizando 36 caracteres (32 caracteres alfanuméricos e 4 hífens). Por exemplo:

550e8400-e29b-41d4-a716-446655440000

Os 128 bits de um UUID são divididos em campos específicos, cada um carregando informações diferentes dependendo da versão do UUID:

  • 32 bits para o campo time_low
  • 16 bits para o campo time_mid
  • 16 bits para o campo time_hi_and_version
  • 8 bits para o campo clock_seq_hi_and_reserved
  • 8 bits para o campo clock_seq_low
  • 48 bits para o campo node

Aqui está um diagrama ilustrando a estrutura do UUID:

A B C D E F A: time_low (32 bits) B: time_mid (16 bits) C: time_hi_and_version (16 bits) D: clock_seq_hi_and_reserved (8 bits) E: clock_seq_low (8 bits) F: node (48 bits)

Versões do UUID

Existem várias versões de UUIDs, cada uma com seu próprio método de geração:

  1. Versão 1 (Baseada em tempo): Usa o timestamp atual e o endereço MAC do computador.
  2. Versão 2 (Segurança DCE): Semelhante à versão 1, mas inclui um identificador de domínio local.
  3. Versão 3 (Baseada em nome, MD5): Gerada pela hash de um identificador de namespace e nome.
  4. Versão 4 (Aleatória): Gerada usando um número aleatório ou pseudo-aleatório.
  5. Versão 5 (Baseada em nome, SHA-1): Semelhante à versão 3, mas usa hash SHA-1.

Esta ferramenta foca na geração de UUIDs da Versão 1 e da Versão 4.

Fórmula

Geração de UUID da Versão 1

UUIDs da versão 1 são gerados usando os seguintes componentes:

  1. Timestamp: Um valor de 60 bits representando o número de intervalos de 100 nanosegundos desde 15 de outubro de 1582 (a data da reforma gregoriana do calendário cristão).
  2. Sequência de relógio: Um valor de 14 bits usado para evitar duplicatas caso o relógio seja ajustado para trás.
  3. Node: Um valor de 48 bits, geralmente derivado do endereço MAC do computador.

A fórmula para gerar um UUID da Versão 1 pode ser expressa como:

UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node

Geração de UUID da Versão 4

UUIDs da versão 4 são gerados usando um gerador de números aleatórios criptograficamente forte. A fórmula é simplesmente:

UUID = random_128_bit_number

Com bits específicos definidos para indicar a versão (4) e a variante.

Casos de Uso

Os UUIDs têm inúmeras aplicações em vários domínios da ciência da computação e engenharia de software:

  1. Chaves de Banco de Dados: UUIDs são frequentemente usados como chaves primárias em bancos de dados, especialmente em sistemas distribuídos onde múltiplos nós podem estar gerando registros simultaneamente.

  2. Sistemas Distribuídos: Em sistemas distribuídos de grande escala, UUIDs ajudam a identificar de forma única recursos, transações ou eventos em múltiplos nós ou data centers.

  3. Endereçamento de Conteúdo: UUIDs podem ser usados para criar identificadores únicos para conteúdo em sistemas de armazenamento endereçados por conteúdo.

  4. Gerenciamento de Sessões: Aplicações web frequentemente usam UUIDs para gerenciar sessões de usuários, garantindo que cada sessão tenha um identificador único.

  5. Identificação de Dispositivos IoT: Em aplicações da Internet das Coisas (IoT), UUIDs podem ser usados para identificar de forma única dispositivos individuais em uma rede.

Alternativas

Embora os UUIDs sejam amplamente utilizados, existem abordagens alternativas para gerar identificadores únicos:

  1. IDs auto-incrementais: Simples e comumente usados em sistemas de banco de dados únicos, mas não adequados para ambientes distribuídos.

  2. IDs baseados em timestamp: Podem ser úteis para dados ordenados por tempo, mas podem enfrentar problemas de colisão em cenários de alta concorrência.

  3. IDs Snowflake: Desenvolvidos pelo Twitter, esses IDs combinam timestamp e número do trabalhador para gerar IDs únicos em sistemas distribuídos.

  4. ULID (Identificador Universal Unicamente Lexicograficamente Ordenável): Uma alternativa mais recente que visa ser mais amigável e ordenável do que os UUIDs.

História

O conceito de UUIDs foi introduzido pela primeira vez no Sistema de Computação em Rede Apollo e posteriormente padronizado pela Open Software Foundation (OSF) como parte do Ambiente de Computação Distribuída (DCE) na década de 1990. A especificação inicial foi publicada em 1997 como ISO/IEC 11578:1996 e posteriormente revisada em 2005 como parte do ISO/IEC 9834-8:2005.

Principais marcos na história do UUID:

  • Anos 1980: A Apollo Computer desenvolve o conceito de UUID para seu Sistema de Computação em Rede.
  • 1997: Primeira especificação de UUID publicada como ISO/IEC 11578:1996.
  • 2005: Especificação de UUID revisada e publicada como parte do ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 define o formato de UUID e os algoritmos de geração usados hoje.

Com o tempo, os UUIDs se tornaram uma ferramenta essencial em sistemas distribuídos e design de banco de dados, com várias implementações e adaptações em diferentes linguagens de programação e plataformas.

Exemplos de Código

Aqui estão exemplos de geração de UUIDs em várias linguagens de programação:

import uuid

## Gerar um UUID da Versão 4 (aleatório)
random_uuid = uuid.uuid4()
print(f"UUID da Versão 4: {random_uuid}")

## Gerar um UUID da Versão 1 (baseado em tempo)
time_based_uuid = uuid.uuid1()
print(f"UUID da Versão 1: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Gerar um UUID da Versão 4 (aleatório)
const randomUuid = uuidv4();
console.log(`UUID da Versão 4: ${randomUuid}`);

// Gerar um UUID da Versão 1 (baseado em tempo)
const timeBasedUuid = uuidv1();
console.log(`UUID da Versão 1: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Gerar um UUID da Versão 4 (aleatório)
        UUID randomUuid = UUID.randomUUID();
        System.out.println("UUID da Versão 4: " + randomUuid);

        // Gerar um UUID da Versão 1 (baseado em tempo)
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("UUID da Versão 1: " + timeBasedUuid);
    }
}
require 'securerandom'

## Gerar um UUID da Versão 4 (aleatório)
random_uuid = SecureRandom.uuid
puts "UUID da Versão 4: #{random_uuid}"

## Ruby não tem um método embutido para UUIDs da Versão 1
## Você precisaria usar uma gem como 'uuidtools' para isso
<?php
// Gerar um UUID da Versão 4 (aleatório)
$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
echo "UUID da Versão 4: " . $randomUuid . "\n";

// PHP não tem um método embutido para UUIDs da Versão 1
// Você precisaria usar uma biblioteca como 'ramsey/uuid' para isso
?>

Referências

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. Organização Internacional de Normalização. (2005). Tecnologia da informação – Interconexão de Sistemas Abertos – Procedimentos para a operação de Autoridades de Registro OSI: Geração e registro de Identificadores Únicos Universais (UUIDs) e seu uso como componentes de Identificadores de Objetos ASN.1. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Identificador único universal. (2023). Na Wikipedia. https://pt.wikipedia.org/wiki/Identificador_unico_universal
  4. ID Snowflake. (2023). Na Wikipedia. https://pt.wikipedia.org/wiki/ID_Snowflake
  5. Especificação ULID. (n.d.). GitHub. https://github.com/ulid/spec
Feedback