UUID v4 vs v7: IDs aleatórios ou IDs ordenados por tempo
Guia UUID v4 vs v7
UUID v4 vs v7 (e GUID vs UUID): qual usar | We.Inc
Como o UUID v7 difere do v4 na RFC 9562, por que IDs ordenados por tempo servem bem como chaves de banco de dados, o que é um GUID, e uma ferramenta no navegador para gerar IDs v4 e v7 e decodificar o timestamp de um v7.
Os dois são identificadores de 128 bits escritos com 36 caracteres. Um UUID v4 tem 122 bits aleatórios, então novos valores caem em qualquer lugar de um índice ordenado. Um UUID v7 começa com um timestamp Unix de 48 bits em milissegundos seguido de bits aleatórios, então os valores ficam ordenados mais ou menos pela hora de criação. A RFC 9562 recomenda o v7 no lugar dos antigos v1 e v6, baseados em tempo.
v4 e v7 comparados
UUID v4
UUID v7
Feito de
122 bits aleatórios
timestamp de 48 bits em milissegundos mais 74 bits aleatórios
Ordem
Aleatória
Mais ou menos pela hora de criação
Revela a hora de criação
Não
Sim, até o milissegundo
Nativo nos navegadores
crypto.randomUUID()
Não, use algumas linhas de código ou uma biblioteca
Bom para
Tokens, IDs públicos, tudo que não pode vazar horário
Chaves primárias de banco, logs, IDs de eventos
Escolher uma versão de UUID é principalmente uma questão de banco de dados. Chaves v4 aleatórias espalham as inserções pelo índice, enquanto chaves v7 chegam em ordem, do mesmo jeito que um número auto-increment chegaria, sem precisar de um contador central. Gere os dois tipos abaixo e depois cole qualquer UUID para ver a versão e, no caso do v7, o momento em que foi criado.
Clique em um botão de gerar para criar um UUID v4 ou v7 novo no seu navegador.
Copie, ou cole qualquer UUID na caixa do decodificador.
O decodificador lê o dígito de versão e os bits de variante e, no v7, transforma os primeiros 48 bits em data e hora.
Gere alguns valores v7 seguidos e repare como os primeiros caracteres quase não mudam.
Guarde UUIDs em uma coluna uuid nativa quando o seu banco tiver uma. Dezesseis bytes ganham de uma string de 36 caracteres em tamanho e em comparações.
Não use v7 quando a hora de criação for sensível, como em tokens de redefinição de senha. Quem tiver o ID consegue ler quando ele foi criado.
crypto.randomUUID() só funciona em páginas seguras (HTTPS ou localhost). Em HTTP simples ele não está disponível.
Dois IDs v7 criados no mesmo milissegundo são ordenados pelos bits aleatórios, não por qual veio primeiro, a menos que a sua biblioteca use os métodos opcionais de contador que a RFC descreve.
Perguntas frequentes
Qual a diferença entre GUID e UUID?
Nenhuma que importe na prática. A RFC 9562 define os UUIDs e observa que eles também são conhecidos como GUIDs, Globally Unique Identifiers, o nome usado pelas ferramentas da Microsoft. Um GUID gerado pelo .NET ou pelo SQL Server é um UUID no mesmo formato de 36 caracteres.
O UUID v7 é um padrão oficial?
Sim. A RFC 9562, publicada em 2024, define as versões 6, 7 e 8 junto com as antigas e torna obsoleta a RFC 4122, o documento que descrevia os UUIDs antes.
O UUID v7 é único o suficiente?
Cada milissegundo tem 74 bits aleatórios para distribuir, o que basta para quase qualquer sistema. Uma colisão exigiria uma quantidade enorme de IDs criados exatamente no mesmo milissegundo.
Consigo recuperar a hora de criação de um UUID v7?
Sim. Os primeiros 12 dígitos hex são o tempo Unix em milissegundos. Cole um no decodificador acima para vê-lo como data, ou converta esses dígitos de número hexadecimal você mesmo.
Devo trocar chaves v4 existentes por v7?
Normalmente não. Os dois são UUIDs válidos e podem conviver na mesma coluna, então linhas novas podem usar v7 enquanto as antigas mantêm os valores v4. Reescrever chaves primárias significa reescrever cada chave estrangeira que aponta para elas.
Por que a ordem importa para bancos de dados
A maioria dos bancos de dados guarda chaves primárias em uma B-tree. Quando cada chave nova é maior que a anterior, as inserções vão para o fim da árvore e as páginas escritas recentemente ficam na memória. Chaves aleatórias forçam escritas em páginas por toda a árvore, o que significa mais divisões de página e mais leituras de disco à medida que a tabela cresce.
A RFC 9562 cita esse problema de localidade como um dos motivos para adicionar versões ordenadas por tempo, e o v7 é a que ela indica para sistemas novos.
Lendo o formato
Na forma de texto, o 13º dígito hex (o primeiro do terceiro grupo) é a versão, então um UUID v7 sempre tem um 7 ali e um v4 tem um 4. O primeiro dígito do quarto grupo é 8, 9, a ou b na variante padrão.
No v7, os 12 dígitos antes da versão são o timestamp. Tudo depois do dígito de versão, exceto os dois bits de variante, é aleatório.
As oito versões de UUID
Versões de UUID na RFC 9562
Versão
Feito de
Observações
Tempo gregoriano mais um ID de nó, muitas vezes o endereço MAC
Legado; prefira v7
Versão DCE Security, não especificada pela RFC 9562
Rara
Baseado em nome, hash MD5 de um namespace e um nome
Mesma entrada, mesmo UUID
Bits aleatórios ou pseudoaleatórios
O padrão mais comum
Baseado em nome, hash SHA-1 de um namespace e um nome
Preferível ao v3
O timestamp do v1 reordenado para que os valores fiquem em ordem de tempo
Prefira v7 em sistemas novos
Tempo Unix Epoch em milissegundos mais bits aleatórios
Chaves ordenáveis
Formato personalizado escolhido pela implementação
Formatos experimentais ou de fornecedores
Código para copiar
UUID v4 no navegador ou no Node
Nativo nos navegadores atuais em páginas seguras e no Node 19 e posteriores pelo objeto global crypto. Retorna uma string de 36 caracteres.
UUID v7 sem biblioteca
Escreve a hora atual nos primeiros seis bytes e depois define os bits de versão e de variante. O resto continua aleatório.
Ler a hora de um UUID v7
Os primeiros 12 dígitos hex são milissegundos desde 1970, então convertê-los dá um Date.
Gerar e decodificar
Gerar v4
Gerar v7
Gerado
Clique em um botão para criar um UUID. Ele é criado no seu navegador e nunca é enviado a lugar nenhum.
Cole um UUID para decodificar
Versão: {v}
RFC 9562 (a padrão)
Não é a variante da RFC 9562
Criado em: {v} (UTC)
Esta versão não carrega um timestamp Unix.
Isso não é um UUID. O esperado são 32 dígitos hex em grupos de 8-4-4-4-12.