A primeira vez que os UUIDs realmente importavam para mim, EU estava movendo um SaaS adjacente ao WordPress de uma única caixa MySQL para uma configuração com uma réplica lida e um plano para destruir mais tarde IDs de incremento automático estavam bem há anos - até que dois serviços começaram a inserir no que se tornaria a mesma tabela lógica, e de repente id = 42 significava duas linhas diferentes. Esse é o momento em que o incremento automático para de funcionar silenciosamente, e os UUIDs são a resposta usual.
Um UUID é um valor de 128 bits que você pode gerar em qualquer máquina, a qualquer momento, sem coordenação e ainda confiar em ser único. Essa parte "nenhuma coordenação" é o ponto principal: um aplicativo móvel offline em um avião, três microsserviços e um trabalhador em segundo plano podem todos os IDs Mint simultaneamente e nunca colidir. A matemática que apoia essa confiança é genuinamente absurda, e eu vou mostrar o quão absurdo em um segundo.
o gerador de uuid no Toolz.dev cria UUIDs únicos ou em massa em várias versões instantaneamente, diretamente no seu navegador - útil quando você e #39; estão semeando uma tabela ou precisam de um ID descartável para um teste Este guia cobre o que as versões realmente significam, qual escolher em 2026, como armazená-las sem destruir o índice do seu banco de dados e os erros que cometi para que você possa ignorá-las.
tl;dr: Para novas chaves primárias de banco de dados em 2026, gere uuid v7- it's ordenado no tempo para que indexe bem e vaze hardware como v1. Usar V4 Quando você deseja pura imprevisibilidade. armazená-los como nativos
uuidtipo ouBINARY(16), nuncaVARCHAR(36). Faça-os em massa com o gerador de uuid, e emparelha-lo com o conversor de carimbo de data/hora Para ler o tempo embutido em um V7. Todos do lado do cliente, todos gratuitos.
O que é um UUID, exatamente?
Um UUID (Universally Unique Identifier) é um número de 128 bits usado para identificar algo sem que uma autoridade central distribua IDs. A Microsoft chama a mesma coisa de GUID (Globally Unique Identifier); eles' são idênticos em todos os sentidos que importam A forma de texto canônico é de 36 caracteres - 32 dígitos hexadecimais divididos em cinco grupos hifenizados de 8-4-4-4-12:
550e8400-e29b-41d4-a716-446655440000
Duas dessas posições hexadecimais são dados aleatórios ' t - metadados & #39; re. O 13o dígito hexadecimal codifica o versão (qual estratégia de geração chegou), e o primeiro dígito do quarto grupo codifica o variante (qual padrão de layout segue - 8, 9, a, ou b para os UUIDs padrão). Portanto, no exemplo acima, o 4 No terceiro grupo informa que é um V4.
Quão único é o "único" realmente?
Após a reserva da versão e da variante, um V4 UUID tem 122 bits aleatórios. São 2^122 valores possíveis ou cerca de 5,3 desviadores:
5,316,911,983,139,663,491,615,228,241,121,400,000
Para fazer esse concreto: se você gerasse um bilhão de UUIDs a cada segundo, você precisaria de aproximadamente 86 anos antes de atingir até 50% de chance de um solteiro colisão em qualquer lugar. Em termos práticos de engenharia, as colisões V4 não acontecem e você pode projetar como se nunca acontecesse.
Qual é a diferença entre UUID V1, V4 e V7?
A especificação - originalmente RFC 4122, agora atualizado por RFC 9562 (2024)- define várias versões Três matéria para o dia-a-dia de trabalho.
UUID v1 - carimbo de data/hora + endereço MAC
v1 costura um carimbo de data/hora de 100 nanossegundos (contando a partir de 15 de outubro de 1582, data em que o calendário gregoriano começou - uma das minhas curiosidades favoritas) com a placa de rede e o endereço MAC no 39. It' é naturalmente ordenado no tempo e você pode extrair dele o tempo de criação.
O problema está na definição: ele incorpora o endereço MAC da máquina que o criou. Isso vaza a identidade do hardware e, combinado com o timestamp, torna os IDs um tanto previsíveis. Exemplo: 6ba7b810-9dad-11d1-80b4-00c04fd430c8. Eu só usaria a V1 para compatibilidade legada agora.
UUID v4 - aleatório
V4 é 122 bits de aleatoriedade e nada mais. É a versão que a maioria das pessoas quer dizer quando diz "UUID" e é muito simples: sem timestamp, sem hardware, sem pedidos. Exemplo: f47ac10b-58cc-4372-a567-0e02b2c3d479.
A vantagem é que não vaza nada e é imprevisível, o que é exatamente o que você deseja para qualquer coisa que não seja adivinhada. A desvantagem é que é acaso, então inserções consecutivas se espalham por todo o seu índice - o que, como descobri, tem um custo real de desempenho em escala.
UUID v7 - ordenado no tempo + aleatório
V7 é o compromisso moderno, padronizado no RFC 9562. Os primeiros 48 bits são um timestamp Unix em milissegundos; o resto é aleatório. Exemplo: 018e4880-d4d0-7b9c-8c37-2a5c0f1e3d8a.
Esse layout significa que os IDs v7 classificam cronologicamente - novas linhas ficam no & quot; end" de um índice de árvore B em vez de se espalharem - enquanto ainda são globalmente únicos e livres de coordenação Ele vaza o tempo aproximado de criação (geralmente bom), mas não o hardware Para novos projetos, esta é minha chave primária padrão, e it' s a direção que o IETF agora aponta também.
Aqui está a troca de relance:
| versão | Encomendado? | vazamentos | melhor para |
|---|---|---|---|
| v1 | Sim (tempo) | Endereço MAC + tempo | Apenas sistemas legados |
| V4 | Não (aleatório) | nada | Tokens inimagináveis, IDs gerais |
| V7 | Sim (tempo) | Tempo aproximado de criação | Chaves primárias do novo banco de dados |
As versões menos usadas também existem: V3 e V5 são hashes determinísticos de um namespace mais um nome (v5 usa SHA-1 e é preferido em relação ao V3, V6 é um V1 reordenado e V8 é reservado para implementações personalizadas.
Você deve usar UUIDs ou IDs de incremento automático?
Este é o debate que tive em mais avaliações de design do que qualquer outra, então aqui está a estrutura que eu realmente uso em vez de uma resposta religiosa.
Fique com o incremento automático quando você tem um único banco de dados, o desempenho e o armazenamento são apertados, e os seres humanos precisam ler os IDs. Um inteiro é 4 bytes 8 versus um UUID & #39; 16, comparações de inteiros são mais rápidas, e & quot; ordem #12345 & quot; é muito mais fácil de ler o telefone do que um UUID de 36 caracteres Em uma única caixa sem estilhaços, o incremento automático é genuinamente a escolha mais simples e rápida - don & #39; t alcançar UUIDs fora de moda.
Mude para UUIDs quando qualquer uma delas é verdadeira: você e #39; são distribuídos (vários serviços ou servidores cunhando IDs de forma independente), você e #39; está preocupado com a enumeração (IDs de incremento automático são adivinháveis e revelam silenciosamente suas contagens de registros - /users/1234 Informa a um invasor que você tem menos de 1.235 usuários), você precisa mesclar dados de vários bancos de dados sem colisões ou deseja que os clientes gerem IDs antes de sincronizar. Esse ponto de enumeração é uma consideração real de segurança que as pessoas subestimam.
E o meio termo V7: UUID V7 fornece a geração distribuída de um UUID e A ordem de incremento automático para índices, sem vazamentos de registros. Para a maioria dos novos projetos em 2026 que precisam de IDs não sequenciais, a V7 é a resposta que encerra o debate.
Como você armazena UUIDs sem destruir seu índice?
Esta é a seção que nasceu do meu próprio erro caro, então preste atenção aqui se em nenhum outro lugar.
Naquela migração que mencionei, armazenei os novos UUIDs como VARCHAR(36) porque era a coisa óbvia e legível de se fazer Funcionou - e então a tabela cresceu, e inserções e junções ficaram mensuravelmente mais lentas Dois problemas se agravaram: Eu estava gastando 36 bytes por ID em vez de 16, e Eu estava usando UUIDs aleatórios V4, então cada inserção desembarcou em um ponto aleatório no índice de chave primária, fragmentando-o e desbaratando o buffer pool. A correção os armazenava como binários e, no próximo projeto, mudando para V7, então as inserções permaneceram sequenciais.
PostgreSQL tem um nativo uuid tipo - use-o Ele armazena 16 bytes e compara rápido:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
mysql Não possui tipo UUID nativo, então armazene BINARY(16) e converter com UUID_TO_BIN() / BIN_TO_UUID(). O segundo argumento é importante:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- The `true` swaps the timestamp bytes for better index locality on v1
INSERT INTO users (id, name, email)
VALUES (UUID_TO_BIN(UUID(), true), 'Alice', '[email protected]');
SELECT BIN_TO_UUID(id, true) AS id, name, email FROM users;
A regra para lembrar: nativo uuid Digite onde você tem um, BINARY(16) onde você não, e VARCHAR(36) Basicamente, nunca para uma chave, você irá indexar e ingressar.
Como você gera UUIDs no código?
Para um rápido one-off, o gerador de uuid é mais rápido do que abrir um repl. No código, cada linguagem principal tem isso embutido ou a um passo de distância.
Javascript / TypeScript- o navegador e o Node enviam um gerador v4 agora:
const id = crypto.randomUUID(); // v4, no dependency needed
// For v7, use the 'uuid' package:
import { v7 as uuidv7 } from 'uuid';
const ordered = uuidv7();
Python:
import uuid
uuid.uuid4() # random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # deterministic (SHA-1)
Java: UUID.randomUUID() Oferece V4 pronto para uso; V7 precisa de uma biblioteca como java-uuid-generator ou uma pequena implementação RFC 9562.
VAI: github.com/google/uuid dá a vocês dois - uuid.New() Para V4 e uuid.NewV7() Para V7.
Observe que os auxiliares de tempo de execução nativos quase sempre oferecem a você v4. Se você deseja especificamente o V7 para o seu pedido, geralmente precisa de uma biblioteca, pois é o padrão mais recente e nem todos os stdlibs foram encontrados.
Onde os UUIDs realmente aparecem em sistemas reais?
É fácil falar sobre os UUIDs em resumo, então aqui estão os lugares concretos em que confiei neles, porque a versão que você escolhe realmente depende do trabalho.
Chaves primárias do banco de dados em uma configuração distribuída. Este é o caso clássico e aquele que começou este artigo para mim O momento em que mais de um escritor pode inserir na mesma tabela lógica - réplicas, fragmentos, ou dois serviços compartilhando um esquema - auto-incremento quebra Uma chave primária v7 resolve o problema de coordenação e ainda indexar de forma limpa porque it' s tempo-ordenado.
IDs gerados pelo cliente para aplicativos offline. Uma aplicação móvel ou um SPA de navegador necessita frequentemente de criar um registo antes de poder falar com o servidor - pense numa nota escrita num avião, ou numa UI optimista que mostre a nova linha instantaneamente Se o cliente cunhar um UUID à frente, o registo tem uma identidade estável desde o primeiro pressionamento de tecla e sincroniza depois sem uma ida e volta do servidor para o & quot; obter um ID." I & #39; usei isto para fazer com que os formulários pareçam instantâneos mesmo em ligações escamosas.
Identificadores de recursos não enumeração em URLs e APIs. colocação /orders/1042 Em um URL silenciosamente, informa a qualquer pessoa que você teve no máximo 1.042 pedidos e permite que eles andem /orders/1041, /orders/1040, e assim por diante. Trocar em um UUID remove tanto o vazamento business-metric quanto a enumeração fácil Para qualquer coisa que um usuário possa ver em uma URL, vale a pena fazer isso - embora lembre-se de que um UUID não é um mecanismo de controle de acesso; você ainda precisa de verificações reais de autorização por trás dele.
IDs de correlação para rastreamento. Quando um único pedido se estende por cinco microsserviços, anexando um UUID como um ID de correlação e registrando-o em cada salto gira & quot; em algum lugar nesta bagunça algo falhou & quot; em uma única string greppable em todos os seus logs Este é um lugar onde até mesmo um v4 simples é perfeito - você não & #39; precisa de pedidos, apenas singularidade.
Chaves de idempotência. As APIs de pagamento e webhook geralmente pedem ao cliente que envie um UUID como uma chave de idempotência para que uma solicitação repetida não carregue um cartão duas vezes. O cliente o gera uma vez, o reutiliza em tentativas e o servidor se desduplica nele. É um padrão pequeno que evita uma classe de bug muito cara.
Perguntas frequentes
Para que serve um UUID?
Um UUID identifica algo exclusivamente - uma linha de banco de dados, um recurso de API, uma sessão, um arquivo carregado, um rastreamento em microsserviços - sem a necessidade de um serviço central para distribuir IDs. It' s a opção de uso sempre que vários sistemas ou clientes devem criar identificadores de forma independente e ainda ter certeza de que venceram' t. Você pode gerar um instantaneamente com o gerador de uuid em Toolz.dev.
Dois UUIDs podem ser idênticos?
Teoria em teoria, na prática não. Um UUID V4 tem 122 bits aleatórios, oferecendo cerca de 5,3 possibilidades de decilionário. Você precisaria gerar na ordem de 2,7 quintilhões de UUIDs antes de atingir 50% de chance de uma colisão. Para cada finalidade de engenharia real, você pode tratar os UUIDs como garantidos.
Qual versão do UUID devo usar em 2026?
Para novas chaves primárias de banco de dados, UUID v7 - it' s ordenada por tempo para indexação eficiente, mantendo-se globalmente única, e it' s a recomendação atual IETF sob RFC 9562. use v4 quando imprevisibilidade importa, tais como identificadores que não devem ser adivinháveis Evite v1 para novos trabalhos, porque incorpora a máquina geradora' s endereço MAC.
Os UUIDs são sequenciais?
v1 e v7 são ordenados no tempo, portanto os IDs gerados posteriormente classificam os anteriores; v4 é totalmente aleatório sem ordem. A ordenação sequencial é o que torna v7 amigável aos índices da árvore B - novas linhas anexam em vez de dispersar. Se você e #39; estiver usando v4 aleatório como chave primária em uma tabela grande, a falta de ordem pode prejudicar o desempenho de inserção e índice.
Como devo armazenar os UUIDs em um banco de dados?
Use o nativo uuid Digite se o banco de dados tiver um (PostgreSQL tem). caso contrário, armazene BINARY(16), e no MySQL 8.0+ converter com UUID_TO_BIN() e BIN_TO_UUID(). evitar VARCHAR(36) ou CHAR(36) para chaves - o armazenamento de strings desperdiça 20 bytes por linha e retarda cada comparação, o que aumenta rapidamente em tabelas grandes.
Qual é a diferença entre um UUID e um GUID?
Eles são a mesma coisa. UUID é o termo do RFC 4122 usado na maioria dos idiomas e plataformas; GUID é o nome da Microsoft, comum no Windows e no .NET. O formato e as garantias são idênticos, portanto, você pode tratar um GUID e um UUID de forma intercambiável.
Posso extrair o tempo de criação de um UUID?
De v1, v6 e v7, sim - eles codificam um carimbo de data/hora. v7 armazena um carimbo de data/hora Unix de milissegundos em seus primeiros 48 bits, que você pode decodificar e ler com o conversor de carimbo de data/hora. V4 e V5 não contêm informações sobre o tempo, portanto, não há nada para extrair deles.
O UUID V4 é seguro o suficiente para tokens de sessão?
não por conta própria. Os 122 bits aleatórios do V4 são imprevisíveis, mas os tokens de sessão e de autenticação geralmente desejam pelo menos 256 bits de um gerador criptograficamente seguro. Use um token aleatório seguro para a autenticação criado especificamente para a autenticação e reserve UUIDs para identificar recursos em vez de protegê-los.
Como gero um UUID?
Use o gerador integrado do seu idioma: crypto.randomUUID() Em navegadores modernos e node.js, uuid.uuid4() em Python, ou Guid.NewGuid() Em .NET, cada um produz um UUID V4 em uma única chamada. Para um lote rápido ou único, gere-os instantaneamente com o gerador de uuid no Toolz.dev - nenhum código necessário.
Quantos caracteres é um UUID?
Um UUID tem 36 caracteres em sua forma de texto canônico: 32 dígitos hexadecimais mais os quatro hífens que o dividem em 8-4-4-4-12 grupos. Esse texto codifica 128 bits, e é por isso que armazená-lo como 16 bytes brutos com BINARY(16) é muito mais compacto que a string de 36 caracteres.
Embrulhando
UUIDs são uma daquelas bases que você faz & #39; t pensar até que um sistema cresça após um único banco de dados - e então eles & #39;re tudo A versão curta de 2026: padrão para V7 Para novas chaves primárias, use V4 Quando você precisar de IDs inimagináveis, armazene-os como nativo uuid ou BINARY(16)e pule a v1 para qualquer coisa nova. aprenda com o meu VARCHAR(36) tarde, para não repetir.
gerá-los instantaneamente com o grátis gerador de uuid no Toolz.dev - único ou em massa, qualquer versão, tudo do lado do cliente sem nada carregado Quando você precisar ler a hora dentro de uma v7, alcance o conversor de carimbo de data/horae navegue pelo restante do Ferramentas de codificação- mais de 600 utilitários gratuitos - mais de Toolz.dev.



