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:
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 [].
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.
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.