Guide des UUID en Java

Guide des UUID en Java

1. Vue d'ensemble

UUID (Universally Unique Identifier), également connu sous le nom de GUID (Globally Unique Identifier) ​​représentea 128-bit long value that is unique for all practical purposes. La représentation standard de l'UUID utilise des chiffres hexadécimaux (octets):

123e4567-e89b-12d3-a456-556642440000

Un UUID est composé de chiffres hexadécimaux (4 caractères chacun) et de 4 symboles «-» qui constituent seslength equal to 36 characters.

L'UUID nul est une forme spéciale d'UUID dans laquelle tous les bits sont mis à zéro.

Dans cet article, nous allons jeter un œil à la classeUUID en Java.

Lectures complémentaires:

CharSequence vs. Chaîne en Java

Apprenez les différences entre CharSequence et String.

Read more

Tableau deUse char[ sur une chaîne pour la manipulation de mots de passe en Java?]

Découvrez plusieurs raisons pour lesquelles nous ne devrions pas utiliser de chaînes pour stocker les mots de passe et utiliser à la place des tableaux char [].

Read more

Guide du pool de chaînes Java

Découvrez comment la machine virtuelle Java optimise la quantité de mémoire allouée au stockage de chaînes dans le pool de chaînes Java.

Read more

2. Structure

Prenons l'exemple d'UUID:

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

A représente la variante qui détermine la disposition de l'UUID. Tous les autres bits de l'UUID dépendent du paramétrage des bits du champ variant. La variante est déterminée par 3 bits les plus significatifs 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)

La valeur deA dans l’UUID mentionné est «a». L’équivalent binaire de ‘a '(= 10xx) indique variante comme 2. B représente la version. La version dans l'UUID mentionné (valeur deB) est 4.

Java fournit des méthodes pour obtenir la variante et la version de l'UUID: __

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

Il existe 5 versions différentes pour les UUID de variante 2: Temps (UUIDv1), Sécurité DCE (UUIDv2), Nom (UUIDv3 et UUIDv5), Aléatoire (UUIDv4).

Java fournit une implémentation pour les v3 et v4, mais fournit également unconstructor pour générer tout type d'UUID:

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

2.1. Version 3 et 5

Les UUID sont générés à l'aide du hachage de l'espace de noms et du nom. Les identificateurs d'espace de nom sont des UUID tels que le système de noms de domaine (DNS), les identificateurs d'objet (OID), les URL, etc.

UUID = hash(NAMESPACE_IDENTIFIER + NAME)

La seule différence entre UUIDv3 et UUIDv5 est l'algorithme de hachage - v3 utilise MD5 (128 bits) tandis que v5 utilise SHA-1 (160 bits).

En termes simples, nous tronquons le hachage résultant à 128 bits, puis nous remplaçons 4 bits pour la version et 2 bits pour la variante.

Générons l’UUID de type 3:

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

Java ne fournit pas l’implémentation pour le type 5. Consultez notre code sourcerepository pour l'UUIDv5.

2.2. Version 4

L'implémentation UUID v4 utilise des nombres aléatoires comme source. L'implémentation Java estSecureRandom - qui utilise une valeur imprévisible comme germe pour générer des nombres aléatoires afin de réduire les risques de collisions.

Générons la version 4 UUID:

UUID uuid = UUID.randomUUID();

Générons une clé unique à l'aide de "SHA-256" et d'un UUID aléatoire:

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

3. Conclusion

UUIDv3 et UUIDv5 ont la propriété nice que différents systèmes peuvent générer le même UUID en utilisant le même espace de nom et le même nom. Celles-ci sont essentiellement utilisées pour créer des UUID hiérarchiques.

Comme les fonctions de hachage MD5 et SHA1 ont toutes deux été interrompues, il est recommandé d’utiliser v5. Si vous avez juste besoin d'une simple génération d'UUID, le type 4 peut convenir pour le cas d'utilisation général.

Et, comme toujours, le code source de l'implémentation est disponibleover on Github.