Guia para UUID em Java

Guia para UUID em Java

1. Visão geral

UUID (Universally Unique Identifier), também conhecido como GUID (Globally Unique Identifier) ​​representaa 128-bit long value that is unique for all practical purposes. A representação padrão do UUID usa dígitos hexadecimais (octetos):

123e4567-e89b-12d3-a456-556642440000

Um UUID é composto de dígitos hexadecimais (4 caracteres cada) junto com 4 símbolos “-” que compõem seulength equal to 36 characters.

O UUID nulo é uma forma especial de UUID na qual todos os bits são definidos como zero.

Neste artigo, daremos uma olhada na classeUUID em Java.

Leitura adicional:

CharSequence vs. String em Java

Aprenda as diferenças entre CharSequence e String.

Read more

Use char[ array sobre uma string para manipular senhas em Java?]

Explore vários motivos pelos quais não devemos usar Strings para armazenar senhas e, em vez disso, usar matrizes char [].

Read more

Guia para o conjunto de strings Java

Aprenda como a JVM otimiza a quantidade de memória alocada para o armazenamento de String no Java String Pool.

Read more

2. Estrutura

Vejamos o exemplo de UUID:

123e4567-e89b-42d3-a456-556642440000
xxxxxxxx-xxxx-Bxxx-Axxx-xxxxxxxxxxxx

A representa a variante que determina o layout do UUID. Todos os outros bits no UUID dependem da configuração dos bits no campo variante. A variante é determinada pelo 3 bit mais significativo de A:

  MSB1    MSB2    MSB3
   0       X       X     reserved (0)
   1       0       X     current variant (2)
   1       1       0     reserved for Microsoft (6)
   1       1       1     reserved for future (7)

O valor deA no UUID mencionado é 'a'. O equivalente binário de ‘a '(= 10xx) mostra a variante como 2. B representa a versão. A versão no UUID mencionado (valor deB) é 4.

Java fornece métodos para obter variante e versão do UUID: __

UUID uuid = UUID.randomUUID();
int variant = uuid.variant();
int version = uuid.version();

Estas são 5 versões diferentes para os UUIDs da variante 2: Baseado em tempo (UUIDv1), Segurança DCE (UUIDv2), Baseado em nome (UUIDv3 e UUIDv5), Aleatório (UUIDv4).

Java fornece uma implementação para v3 e v4, mas também fornece umconstructor para gerar qualquer tipo de UUID:

UUID uuid = new UUID(long mostSigBits, long leastSigBits);

2.1. Versão 3 e 5

Os UUIDs são gerados usando o hash do espaço para nome e nome. Os identificadores do espaço para nome são UUIDs, como DNS (Sistema de Nomes de Domínio), OIDs (Identificadores de Objeto), URLs etc.

UUID = hash(NAMESPACE_IDENTIFIER + NAME)

A única diferença entre UUIDv3 e UUIDv5 é o algoritmo de hash - a v3 usa MD5 (128 bits) enquanto a v5 usa SHA-1 (160 bits).

Simplificando, truncamos o hash resultante para 128 bits e substituímos 4 bits para a versão e 2 bits para a variante.

Vamos gerar UUID tipo 3:

String source = namespace + name;
byte[] bytes = source.getBytes("UTF-8");
UUID uuid = UUID.nameUUIDFromBytes(bytes);

Java não fornece a implementação para o tipo 5. Verifique nosso código-fonterepository para o UUIDv5.

2.2. Versão 4

A implementação do UUID v4 usa números aleatórios como fonte. A implementação Java éSecureRandom - que usa um valor imprevisível como a semente para gerar números aleatórios para reduzir a chance de colisões.

Vamos gerar o UUID da versão 4:

UUID uuid = UUID.randomUUID();

Vamos gerar uma chave única usando 'SHA-256' e um UUID aleatório:

MessageDigest salt = MessageDigest.getInstance("SHA-256");
salt.update(UUID.randomUUID().toString().getBytes("UTF-8"));
String digest = bytesToHex(salt.digest());

3. Conclusão

O UUIDv3 e o UUIDv5 têm a propriedade agradável de que sistemas diferentes podem gerar o mesmo UUID usando o mesmo espaço para nome e nome. Eles são basicamente usados ​​para criar UUIDs hierárquicos.

Como as funções de hash MD5 e SHA1 foram interrompidas, é recomendável usar a v5. Se você precisar apenas de geração UUID simples, o tipo 4 pode ser bom para o caso de uso geral.

E, como sempre, o código-fonte de implementação está disponívelover on Github.