Qual versão do UUID você deve usar? Vi muitos tópicos explicando o que cada versão implica, mas estou tendo problemas para descobrir o que é melhor para quais aplicativos.
Qual versão do UUID você deve usar? Vi muitos tópicos explicando o que cada versão implica, mas estou tendo problemas para descobrir o que é melhor para quais aplicativos.
Respostas:
Existem duas maneiras diferentes de gerar um UUID.
Se você só precisa de um ID exclusivo, deseja uma versão 1 ou 4.
Versão 1: gera um ID exclusivo com base no endereço MAC da placa de rede e em um timer. Esses IDs são fáceis de prever (dado um, posso adivinhar outro) e podem ser rastreados até sua placa de rede. Não é recomendado criá-los.
Versão 4: são gerados a partir de números aleatórios (ou pseudo-aleatórios). Se você só precisa gerar um UUID, provavelmente é isso que você deseja.
Se você sempre gerar o mesmo UUID a partir de um determinado nome, deseje uma versão 3 ou 5.
Versão 3: gera um ID exclusivo a partir de um hash MD5 de um espaço para nome e nome. Se você precisar de compatibilidade com versões anteriores (com outro sistema que gera UUIDs a partir de nomes), use isso.
Versão 5: gera um ID exclusivo a partir de um hash SHA-1 de um espaço para nome e nome. Esta é a versão preferida.
reproducible
UUID a partir de um determinado nome, deseja uma versão 3 ou 5. Se você alimentar esse algoritmo com a mesma entrada, ele gerará a mesma saída.
Se você deseja um número aleatório, use uma biblioteca de números aleatórios. Se você deseja um identificador exclusivo com efetivamente 0,00 ... muito mais 0s aqui ... 001% de chance de colisão, use o UUIDv1. Veja a publicação de Nick para UUIDv3 e v5.
UUIDv1 NÃO é seguro. Não é para ser assim. É para ser ÚNICO, não impossível de adivinhar. O UUIDv1 usa o registro de data e hora atual, além de um identificador de máquina, além de algumas informações aleatórias para criar um número que nunca será gerado por esse algoritmo novamente. Isso é apropriado para um ID de transação (mesmo se todo mundo estiver fazendo milhões de transações / s).
Para ser sincero, não entendo por que o UUIDv4 existe ... ao ler o RFC4122 , parece que essa versão NÃO elimina a possibilidade de colisões. É apenas um gerador de números aleatórios. Se isso for verdade, você tem uma boa chance de duas máquinas no mundo criarem o mesmo "UUID" v4 (aspas, porque não há um mecanismo para garantir a exclusividade da U.niversal). Nessa situação, não acho que o algoritmo pertença a uma RFC que descreve métodos para gerar valores únicos. Pertencia a uma RFC sobre gerar aleatoriedade. Para um conjunto de números aleatórios:
chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
set_size
é 2 ^ 122, que é muito grande .
Essa é uma pergunta muito geral. Uma resposta é: "depende de que tipo de UUID você deseja gerar". Mas uma melhor é a seguinte: "Bem, antes de responder, você pode nos dizer por que precisa codificar seu próprio algoritmo de geração UUID em vez de chamar a funcionalidade de geração UUID que a maioria dos sistemas operacionais modernos oferece?"
Fazer isso é mais fácil e seguro e, como você provavelmente não precisa gerar o seu próprio, por que se preocupar em codificar uma implementação? Nesse caso, a resposta passa a ser o que quer que seu sistema operacional, linguagem de programação ou estrutura forneça. Por exemplo, no Windows, há CoCreateGuid ou UuidCreate ou um dos vários wrappers disponíveis nas diversas estruturas em uso. No Linux, há uuid_generate .
Se, por algum motivo, você absolutamente precisar gerar o seu próprio, pelo menos tenha o bom senso de evitar UUIDs v1 e v2. É complicado acertar as coisas. Em vez disso, atenha-se aos UUIDs v3, v4 ou v5.
Atualização : em um comentário, você menciona que está usando Python e cria um link para isso . Examinando a interface fornecida, a opção mais fácil para você seria gerar um UUID v4 (ou seja, um criado a partir de dados aleatórios) chamando uuid.uuid4()
.
Se você tiver alguns dados dos quais você precisa (ou pode) fazer o hash para gerar um UUID, poderá usar a v3 (que depende do MD5) ou a v5 (que depende do SHA1). Gerar um UUID v3 ou v5 é simples: primeiro escolha o tipo de UUID que você deseja gerar (você provavelmente deve escolher v5) e, em seguida, escolha o espaço para nome apropriado e chame a função com os dados que deseja usar para gerar o UUID. Por exemplo, se você estiver hash um URL, você usaria NAMESPACE_URL
:
uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')
Observe que este UUID será diferente do UUID v5 para o mesmo URL, que é gerado assim:
uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')
Uma boa propriedade dos URLs v3 e v5 é que eles devem ser interoperáveis entre implementações. Em outras palavras, se dois sistemas diferentes estiverem usando uma implementação que esteja em conformidade com a RFC4122, eles (ou pelo menos deveriam ) criarão o mesmo UUID se todas as outras coisas forem iguais (por exemplo, gerar a mesma versão UUID, com o mesmo espaço de nome e o mesmos dados). Essa propriedade pode ser muito útil em algumas situações (especialmente em cenários de armazenamento endereçável por conteúdo), mas talvez não no seu caso particular.
NAMESPACE_URL
é um UUID geralmente igual a 6ba7b811-9dad-11d1-80b4-00c04fd430c8
, seguindo a recomendação feita na página 30 da RFC-4122 .
A documentação do Postgres descreve as diferenças entre UUID
s. Alguns deles:
V3:
uuid_generate_v3(namespace uuid, name text)
- Esta função gera um UUID da versão 3 no espaço de nome fornecido usando o nome de entrada especificado.
V4:
uuid_generate_v4
- Esta função gera um UUID versão 4, derivado inteiramente de números aleatórios.