Créer un GUID en Java


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 .

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();


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.


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() );
    }
}

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 .

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.