Créer un GUID en Java

378

Quelles sont les meilleures façons de créer un GUID en Java?

Chris Dutrow
la source
3
La question sur stackoverflow.com/questions/325443/generate-uuid-in-java concerne davantage les collisions GUID, puis comment l'équivalent d'un GUID se trouve dans la pile technologique Java, qui est (je pense) plus au centre de cette question.
Jon Adams

Réponses:

348

Jetez un œil à la classe UUID fournie avec Java 5 et versions ultérieures.

Par exemple:

  • Si vous voulez un UUID aléatoire, vous pouvez utiliser la méthode randomUUID .
  • Si vous souhaitez qu'un UUID soit initialisé à une valeur spécifique, vous pouvez utiliser le constructeur UUID ou la méthode fromString .
Mark Byers
la source
7
Si vous incluez un exemple comme l'a fait Kaleb Brasee, votre bonne réponse serait encore meilleure.
Zero3
Fonctionne dans AndroidStudio 2.3 et sur les niveaux d'API 21 et au-delà au moins. Peut-être plus loin aussi.
raddevus
6
TL; DR ... "UUID uuid = UUID.randomUUID ();"
Aviram Fireberger
420

java.util.UUID.randomUUID();

Kaleb Brasee
la source
2
pourrait-il retourner répéter? parce que Guid ne va jamais se répéter
ange
4
@angel Oui, il est théoriquement possible que la UUID.randomUUIDméthode retourne un doublon, mais ce n'est pas du tout une préoccupation réaliste . L'implémentation Oracle / OpenJDK utilise un générateur de nombres aléatoires cryptographiquement fort. Compte tenu de cela, et compte tenu de la plage astronomique donnée par autant de bits dans un UUID, vous pouvez générer plusieurs millions de ces valeurs dans votre application et toujours bien dormir. L'utilisation de l'une des autres variantes réduit encore plus la possibilité de collisions encore plus proches de zéro en raison de l'utilisation de «l'espace et du temps», [1] de l'adresse ou du nom MAC et [2] de la date et de l'heure actuelles, comme contraintes.
Basil Bourque
@RenniePet Eh, si vous êtes paranoïaque et que vous avez accès à la liste des ID déjà utilisés lors de la création d'un nouveau, vous whilen'en générez que de nouveaux dans un jusqu'à ce que vous en obteniez un qui ne figure pas dans votre liste: p
Nyerguds
2
Le générateur de nombres aléatoires cryptographiques Oracle est généralement un PRNG avec une graine aléatoire. La graine aléatoire est généralement obtenue en utilisant une source "d'entropie" fournie par l'OS. Si vous pouvez dégrader ou compromettre cette source, la probabilité qu'un générateur de nombres aléatoires cryptographiques produise le même nombre est augmentée. Il convient également de noter que sur certaines plates-formes (par exemple virtualisées), le système d'exploitation peut manquer d'entropie. Il existe des «hacks douteux» pour contourner ce problème, mais ils entraînent une dégradation de la qualité de l'entropie.
Stephen C
Ce n'est pas seulement une préoccupation académique. J'ai vu une affirmation ( non vérifiée !! ) que quelqu'un avait rencontré des problèmes avec des UUID aléatoires qui n'étaient pas uniques.
Stephen C
32

Cela dépend du type d' UUID que vous souhaitez.

  • La UUIDclasse Java standard génère des UUID de version 4 (aléatoires). ( UPDATE - Version 3 (nom) Les UUID peuvent également être générés.) Il peut également gérer d'autres variantes, bien qu'il ne puisse pas les générer. (Dans ce cas, "gérer" signifie construire des UUIDinstances à partir de long, byte[]ou des Stringreprésentations, et fournir des accesseurs appropriés.)

  • L' implémentation Java UUID Generator (JUG) est censée prendre en charge "les 3 types d'UUID" officiels "tels que définis par la RFC-4122 " ... bien que la RFC définisse en fait 4 types et mentionne un 5ème type.

Pour plus d'informations sur les types et variantes d'UUID, il y a un bon résumé sur Wikipedia , et les détails sanglants sont dans RFC 4122 et les autres spécifications.

Stephen C
la source
1
Pas complètement vrai, il peut également générer des UUID basés sur le nom (version 3) avecUUID.nameUUIDFromBytes(byte[] name)
DennisK
Je me suis trompé. Je me suis appuyé sur la description de javadoc qui dit "Usine statique pour récupérer un UUID de type 3 (basé sur le nom) basé sur le tableau d'octets spécifié."
Stephen C
Je ne pense pas que le message soit exact. Les documents Java UUID indiquent que le constructeur génère une variante de type 2, non aléatoire. Pour une utilisation de type 3 public static UUID nameUUIDFromBytes(byte[] name). pour une utilisation de type 4 public static UUID randomUUID(). Le type 1 n'est pas disponible avec la classe JDK.
slartibartfast
Non. Je pense que j'ai bien compris. Les javadocs déclarent: "bien que les constructeurs autorisent la création de n'importe quelle variante d'UUID (décrite ci-dessous)." et 4 variantes sont listées ci-dessous, dont le type 1. En effet, lisez le javadoc pourclockSequence()
Stephen C
27

Juste pour étendre la réponse de Mark Byers avec un exemple:

import java.util.UUID;

public class RandomStringUUID {
    public static void main(String[] args) {
        UUID uuid = UUID.randomUUID();
        System.out.println("UUID=" + uuid.toString() );
    }
}
Anton Belev
la source
7

Les autres réponses sont correctes, en particulier celle de Stephen C .

Atteindre l'extérieur de Java

La génération d'une valeur UUID dans Java est limitée à la version 4 (aléatoire) raison de problèmes de sécurité.

Si vous souhaitez d'autres versions d'UUID, une solution consiste à faire en sorte que votre application Java atteigne l'extérieur de la JVM pour générer des UUID en appelant:

  • Utilitaire de ligne de commande
    Fourni avec presque tous les systèmes d'exploitation.
    Par exemple, uuidgentrouvé dans Mac OS X, BSD et Linux.
  • Serveur de base de données
    Utilisez JDBC pour récupérer un UUID généré sur le serveur de base de données.
    Par exemple, l' uuid-osspextension est souvent fournie avec Postgres . Cette extension peut générer des valeurs des versions 1, 3 et 4 et en plus quelques variations:
    • uuid_generate_v1mc() - génère un UUID version 1 mais utilise une adresse MAC de multidiffusion aléatoire au lieu de la véritable adresse MAC de l'ordinateur.
    • uuid_generate_v5(namespace uuid, name text) - génère un UUID version 5, qui fonctionne comme un UUID version 3 sauf que SHA-1 est utilisé comme méthode de hachage.
  • Service Web
    Par exemple, le générateur UUID crée les versions 1 et 3 ainsi que les valeurs nulles et le GUID .
Basil Bourque
la source
3
J'ai quelques problèmes avec votre réponse: tout d'abord, il a déjà été démontré que vous ne pouvez obtenir que V4 à partir de la bibliothèque Java standard (V3 est également possible). Deuxièmement, vous donnez l'impression qu'il n'y a pas d'options au sein de Java en dehors de la bibliothèque standard, avec une main ondulée "en raison de problèmes de sécurité". Et enfin, il est généralement inefficace (en termes de programmation et / ou de performances) de commencer à dépendre de sources externes alors qu'il existe de nombreuses façons de le faire dans Java (sauf si vous en avez besoin, par exemple, dans le cadre de la création d'un enregistrement dans le serveur SQL).
DennisK