UUID
UUID ( inglês universalmente único identificador "Universal Unique Identifier") é um padrão de identificação usado no desenvolvimento de software , padronizado pela Open Software Foundation (OSF) como parte do DCE - Distributed Computing Environment. O principal objetivo do UUID é permitir que sistemas distribuídos identifiquem informações de forma exclusiva sem uma câmara de compensação. Assim, qualquer pessoa pode criar um UUID e usá-lo para identificar algo com um nível razoável de confiança de que o identificador fornecido inadvertidamente nunca será usado para outra coisa. Portanto, as informações marcadas com um UUID podem ser colocadas posteriormente em um banco de dados compartilhado sem a necessidade de resolver conflitos de nome. O uso mais comum desse padrão é o Identificador Global Exclusivo ( GUID ) da Microsoft . Outros usuários significativos são Linux ( sistema de arquivos ext2 / ext3 , LUKSpartições criptografadas, GNOME , KDE ) e Mac OS X usam uma implementação derivada da biblioteca uuid encontrada no pacote e2fsprogs.
Normas
O UUID está documentado como parte da ISO / IEC 11578:1996 " Tecnologia da informação - Interconexão de sistemas abertos - Chamada de procedimento remoto (RPC)" e posteriormente na ITU-T Rec. X.667 | ISO / IEC 9834-8:2008. O IETF publicou um padrão proposto , RFC 4122 , que é tecnicamente idêntico ao ITU-T Rec. X.667 | ISO/IEC 9834-8.
Formato
O UUID é um número de 16 bytes (128 bits ). Em sua representação canônica, um UUID é representado como um número hexadecimal separado por hífens em cinco grupos no formato 8-4-4-4-12. Esta representação leva 36 caracteres:
123e4567-e89b-12d3-a456-426655440000xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Os 4 bits Mindicam a versão ("versão") do UUID e os 1-3 bits mais significativos Nindicam a variante ("variante") do UUID.
Este agrupamento é baseado na estrutura UUID:
| Nome do campo | Comprimento (em bytes) | Comprimento (número de dígitos hexadecimais) | Contente |
|---|---|---|---|
| tempo_baixo | quatro | oito | um inteiro que denota os 32 bits mais baixos do tempo |
| time_mid | 2 | quatro | um inteiro denotando a média de 16 bits de tempo |
| time_hi_and_version | 2 | quatro | Os 4 bits mais significativos indicam a versão do UUID, os bits menos significativos indicam os 12 bits mais significativos do tempo |
| clock_seq_hi_and_res clock_seq_low | 2 | quatro | 1-3 bits altos indicam a variante UUID, os restantes 13-15 bits indicam a sequência do relógio |
| nó | 6 | 12 | ID de host de 48 bits |
Esses campos correspondem às versões 1 e 2 do UUID, que são geradas com base no tempo, mas a representação 8-4-4-4-12 é usada para qualquer versão do UUID.
A RFC 4122 também define um namespace URN para UUIDs:
urn:uuid:123e4567-e89b-12d3-a456-426655440000
O GUID da Microsoft às vezes é usado com chaves:
{123e4567-e89b-12d3-a456-426655440000}
O número total de chaves UUID exclusivas (excluindo versões) é 2128 = 25616 ou cerca de 3,4 × 1038 . Isso significa que, ao gerar 1 trilhão de chaves a cada nanossegundo , levará apenas 10 bilhões de anos para classificar todos os valores possíveis.
Um UUID com um identificador especial pode ser reutilizado intencionalmente para identificar a mesma entidade em diferentes contextos. Por exemplo, no Microsoft Component Object Model , cada componente deve oferecer suporte à interface " IUnknown " padrão. Para isso, é criado um UUID que representa " IUnknown ". Em todos os casos em que é utilizado " IUnknown " - ao acessar processos à interface " IUnknown " no componente, ou para implementar suporte à interface " IUnknown " pelo próprio componente - o mesmo identificador é sempre referido: 00000000-0000-0000-C000-000000000046.
Codificação
A representação binária de um UUID varia em diferentes sistemas.
A maioria dos sistemas codifica o UUID inteiramente em big-endian . Por exemplo, 00112233-4455-6677-8899-aabbccddeeffcodificado em bytes 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff.
Alguns sistemas, como marshaling nas bibliotecas COM/OLE da Microsoft , usam mixed-endian , onde os três primeiros componentes do UUID são codificados como little-endian e os dois últimos como big-endian. Por exemplo, 00112233-4455-6677-8899-aabbccddeeffneste caso é codificado como 33 22 11 00 55 44 77 66 88 99 aa bb cc dd ee ff.
Opções
Por razões históricas, o UUID possui diversas variantes, denotadas por um, dois ou três bits.
Opção 0
Uma das opções definidas na RFC 4122 , opção 0 (indicada por um único bit 0xxx 2 , N = 0..7), está presente para compatibilidade com o formato UUID obsoleto do Apollo Network Computing System 1.5 desenvolvido por volta de 1988. Nesse formato, os primeiros 6 octetos do UUID são um timestamp de 48 bits (o número de unidades de tempo de 4 microssegundos que decorreram desde 1º de janeiro de 1980 UTC); os próximos 2 octetos são reservados; o próximo octeto é "família de endereços"; os últimos 7 octetos são o ID do host de 56 bits na forma especificada pela família de endereços. Apesar da diferença nos detalhes, pode-se ver a semelhança com o UUID moderno da versão 1. Os bits variantes na especificação UUID atual são os mesmos que os bits altos do octeto da família de endereços no UUID NCS. Embora uma família de endereços possa conter valores na faixa 0..255, apenas os valores 0..13 foram definidos. Assim, designar a opção 0 como 0xxxevita conflitos com UUIDs NCS históricos se eles ainda existirem nos bancos de dados.
Opções 1 e 2
Essas variantes são usadas nas especificações UUID atuais. A opção 1 (indicada por dois bits 10xx 2 N = 8..b) é a principal e está descrita na RFC 4122 . A opção 2 (indicada pelos três bits 110x 2 N = c..d) é descrita na RFC como reservada para compatibilidade com versões anteriores dos GUIDs do Microsoft Windows .
Além dos bits variantes, os dois UUIDs são os mesmos, exceto que, quando codificados em formato binário para armazenamento ou transmissão, os UUIDs variante 1 usam ordem de byte de rede (big-endian), enquanto os GUIDs variante 2 usam ordem de byte nativa. (little -endian) ordem de bytes. Na representação textual canônica, as opções 1 e 2 são as mesmas, exceto pelos bits de opção.
Embora alguns GUIDs importantes, como o identificador de interface IUnknown para COM, sejam UUIDs da variante 2, muitos dos identificadores criados e usados no software Microsoft Windows e chamados de "GUIDs" são, na verdade, UUIDs da variante 1 padrão na ordem de byte da rede. A versão atual do utilitário da Microsoft guidgengera UUIDs variantes padrão 1. Alguns documentos da Microsoft dizem que "GUID" é um sinônimo de "UUID", [1] conforme padronizado na RFC 4122 . O próprio RFC 4122 afirma que os UUIDs também são conhecidos como GUIDs ("também são conhecidos como GUIDs"). Tudo isso sugere que "GUID", embora originalmente uma variante separada do UUID usado pela Microsoft, agora se tornou apenas um nome alternativo para o UUID padrão.
Opção 3
Na RFC 4122 , 111x 2 ( N = e..f) é reservado para uso futuro.
Versões
O padrão define cinco versões ("versão") de UUIDs, cada uma das quais pode ser melhor ou pior em determinadas situações.
Nil UUID
Um caso especial em que todos os bits UUID são definidos como zero: 00000000-0000-0000-0000-000000000000.
Versão 1 (hora e endereço MAC)
A versão 1 inclui o endereço MAC de 48 bits do nó ("nó") no qual o UUID foi gerado e um carimbo de data/hora de 60 bits (timestamp) que indica o número de intervalos de 100 ns decorridos desde a meia-noite de 15 de outubro de 1582 UTC — data de início do uso do calendário gregoriano . A RFC 4122 especifica um tempo máximo possível em torno de 3400 CE. e., o que significa que o carimbo de data/hora de 60 bits está assinado. No entanto, alguns programas, como a biblioteca libuuid, consideram o timestamp como unsigned [2] , e para eles o tempo máximo é em torno de 5236 CE. e.
Uma sequência de relógio de 13 ou 14 bits preenche o carimbo de data/hora nos casos em que o relógio do sistema não é atualizado com rapidez suficiente ou em sistemas multiprocessadores. Nesses casos, UUIDs diferentes podem ter o mesmo carimbo de data/hora. Para evitar gerar os mesmos UUIDs, é usada uma sequência de relógio, que é atualizada toda vez que um novo UUID é criado e que será diferente para UUIDs diferentes, mesmo que os carimbos de data e hora correspondam. Como os UUIDs da versão 1 correspondem a um único ponto no espaço (nó) e no tempo (timestamp e sequência de relógio), a chance de correspondência de dois UUIDs gerados corretamente é praticamente zero. Como o timestamp e a sequência de clock juntos são de 74 bits, um total de 2 74 (1,8⋅10 22 ou 18 sextilhões ) UUIDs de versão 1 exclusivos podem ser gerados em um único nó a uma taxa média máxima de 163 bilhões de UUIDs por segundo.
Ao contrário de outras versões do UUID, a exclusividade dos UUIDs da versão 1 e da versão 2 com base em endereços NIC MAC depende em parte de um identificador emitido por uma autoridade de registro central, ou seja, a parte Organization Unique Identifier (OUI) do endereço MAC, que é emitida pelos fabricantes de equipamentos de rede IEEE . [3] A exclusividade também depende da atribuição correta de endereços MAC exclusivos pelos fabricantes de NICs, que, como outros processos de fabricação, são propensos a erros.
Usar o endereço MAC significa que você sempre pode rastrear o computador que criou o UUID. Às vezes, é possível encontrar o computador no qual um documento foi criado ou editado se o processador de texto usado tiver o UUID incorporado no arquivo. Este buraco de privacidade foi usado para encontrar o autor do vírus Melissa . [quatro]
Versão 2 (hora, endereço MAC e versão de segurança do DCE)
A RFC 4122 reserva a versão 2 "segurança DCE", mas não fornece detalhes sobre ela. Por esse motivo, muitas implementações de UUID não possuem a versão 2. No entanto, a versão 2 UUID é descrita na especificação DCE 1.1 Authentication and Security Services. [5]
A versão 2 é semelhante à versão 1, mas os 8 bits inferiores da sequência de relógio são substituídos por um número de "domínio local" e os 32 bits inferiores do carimbo de data/hora são substituídos por um identificador inteiro significativo dentro do domínio local especificado.
A capacidade de incluir um domínio/identificador de 40 bits é um compromisso. Por um lado, 40 bits permitem cerca de 1 trilhão de valores de domínio/identificador para um único nó. Por outro lado, com o timestamp reduzido para 28 MSBs de 60 bits na versão 1, o UUID versão 2 só marcará o tempo a cada 429,49 segundos (pouco mais de 7 minutos), em oposição a 100 nanossegundos na versão 1. E com os 6 -bit clock seqüência, em oposição aos 14 bits na versão 1, apenas 64 UUIDs exclusivos podem ser gerados para um único host/domínio/id durante esses 7 minutos. Portanto, o UUID versão 2 não é apropriado se você quiser gerar um UUID mais de uma vez a cada 7 minutos.
Versões 3 e 5
Os UUIDs das versões 3 e 5 são gerados pelo hash de um identificador de namespace e um nome. A versão 3 usa o algoritmo de hash MD5 , a versão 5 usa SHA-1 .
A especificação fornece um UUID para representar os namespaces de nomes distintos URL , FQDN , OID e X.500 , mas qualquer UUID desejado pode ser usado como um identificador de namespace.
Para calcular o UUID da versão 3 correspondente a um determinado namespace e nome, o UUID do namespace é convertido em um byte, concatenado com o nome e codificado com o algoritmo MD5, resultando em 128 bits. Os 6 ou 7 bits são então substituídos por valores fixos: uma versão de 4 bits (por exemplo, 0011 2 para a versão 3) e uma variante de 2 ou 3 bits do UUID (por exemplo, 10 2 , que significa RFC 4122 UUID ou 110 2 , denotando o legado Microsoft GUID). Como 6 ou 7 bits são predefinidos, apenas 121 ou 122 bits contribuem para a exclusividade do UUID.
A versão 5 UUID é semelhante, mas usa SHA-1 em vez de MD5. Como o SHA-1 fornece um hash de 160 bits, ele é pré-truncado para 128 bits.
A essência das versões 3 e 5 do UUID é que o mesmo par do namespace e do nome será mapeado para o mesmo UUID. Nesse caso, nem o namespace nem o nome podem ser recuperados do UUID, exceto por força bruta.
A RFC 4122 recomenda o uso da versão 5 em vez da versão 3 e não recomenda o uso de nenhuma das versões como credencial de segurança.
Versão 4 (aleatório)
Versão 4 UUID é gerado aleatoriamente. Tal como acontece com outras versões do UUID, 4 bits são usados para indicar a versão, 2 ou 3 bits indicam a variante. Portanto, para a variante 1 (que é usada pela maioria dos UUIDs), há 122 bits por parte gerada aleatoriamente, o que dá 2122 , ou 5,3⋅10 36 (5,3 undecilhão ) UUIDs possíveis da versão 4 da variante 1. UUID da versão 4 da variante 2 tem metade das opções possíveis, pois um bit a mais é usado para designar uma variante.
Notas
- ↑ Identificadores Globalmente Exclusivos . Rede de desenvolvedores da Microsoft . Microsoft . Recuperado em 18 de junho de 2019. Arquivado do original em 13 de fevereiro de 2019.
- ↑ ext2/e2fsprogs.git - utilitários de espaço de usuário do sistema de arquivos Ext2/3/4 . kernel.org . Recuperado: 9 de janeiro de 2017. (link indisponível)
- ↑ O Instituto de Engenheiros Elétricos e Eletrônicos, Incorporated (IEEE). Autoridade de registro (não especificada) . — 1963.
- ↑ Reiter, Luke Rastreando os Alter Egos de Melissa . ZDNet . CBS Interactive (2 de abril de 1999). Data de acesso: 16 de janeiro de 2017. Arquivado a partir do original em 21 de outubro de 2012.
- ↑ DCE 1.1: Serviços de autenticação e segurança . O Grupo Aberto. Recuperado em 18 de junho de 2019. Arquivado a partir do original em 7 de dezembro de 2010.
Links
- RFC 4122 - Um namespace URN de identificador universalmente exclusivo (UUID)
- Função de registro global UUID no ITU-T
- Projeto e criptoanálise do gerador UUID no sistema operacional Windows