web-dev-qa-db-fra.com

Est-il sûr de supprimer le "-" dans un UUID généré aléatoirement?

J'ai ce code:

String uuid = UUID.randomUUID().toString().replace("-", "");

Est-il sécuritaire de supprimer le "-" dans l’UUID généré? Est-ce que le supprimer irait à l'encontre du but d'être unique au monde et rendrait le UUID généré sujet aux collisions?

62
xybrek

quelle sécurité si est de supprimer le "-" dans l'UUID généré

C'est 100% sûr puisque les tirets ne font pas partie de la valeur. L'UUID de chaîne est une représentation hexadécimale d'une valeur de 128 bits. Les tirets sont juste là pour l'affichage, donc les UUID seront un peu plus faciles pour les yeux.

Soyez prudent lorsque vous transmettez des UUID sous la forme String à des systèmes externes tels que des API externes, des bases de données et des éléments de ce type. Ils pourraient s'attendre à ce que les tirets soient là.

99
Malt

Disons que je veux appeler la Maison Blanche. Leur numéro de téléphone est le (202) 456-1111. Si je supprime tous les tirets et toutes les parenthèses de ce numéro de téléphone, il ne me reste que 2024561111. Je n’ai perdu aucune information au cours de cette opération; j’ai simplement modifié le formatage de manière à le rendre plus difficile à lire. Si je compose ce numéro sur mon téléphone, il passe l'appel correctement car le système téléphonique sait toujours que les trois premiers chiffres correspondent à l'indicatif régional et les sept suivants constituent le numéro principal.

De la même manière, les tirets dans un UUID ressemblent à la ponctuation supplémentaire dans un numéro de téléphone - ils sont inclus afin qu’il soit plus facile pour un humain de lire un grand nombre sous-jacent. Dans les UUID, ce nombre a une longueur de 128 bits et est écrit en hexadécimal. Ainsi, contrairement à un numéro de téléphone, il s’agit d’un chiffre moins "évident", mais le principe de base est le même. La suppression des tirets ne changera pas le nombre et n'aura donc pas d'impact sur la sécurité.

Maintenant, ce qui pourrait arriver, c’est que cela brise la compatibilité de la mise en forme sur toutes les plates-formes. Revenons à l’analogie avec le numéro de téléphone. Certains sites Web que j'ai utilisés ne me permettent pas de saisir le numéro de téléphone en 2024561111. Ils insisteront pour que je mette des espaces, des tirets et des parenthèses, comme dans le (202) 456-1111. (Je ne suis pas un fan de sites comme celui-ci, mais c'est une autre histoire.) Donc, supprimer les tirets de votre UUID peut potentiellement poser problème si vous devez passer une représentation sous forme de chaîne de l'UUID dans un autre processus ou service qui attend la formatage complet, y compris les virgules.

45
templatetypedef

Les tirets dans un UUID correctement formé ne sont pas placés aléatoirement dans la chaîne - il s'agit d'un format spécifique détaillé dans les RFC - http://www.ietf.org/rfc/rfc4122.txt

Ainsi, la suppression des tirets n'affectera pas le caractère unique de l'UUID.

Toutefois, cela peut entraîner des problèmes avec les bibliothèques qui attendent des tirets dans le cadre d'un UUID pour le valider en tant qu'UUID.

Pourquoi voulez-vous les supprimer?

10
HorusKol

Vous pouvez vérifier comment la chaîne est créée en lisant le javadoc :

UUID                   = <time_low> "-" <time_mid> "-"
                      <time_high_and_version> "-"
                      <variant_and_sequence> "-"
                      <node>
time_low               = 4*<hexOctet>
time_mid               = 2*<hexOctet>
time_high_and_version  = 2*<hexOctet>
variant_and_sequence   = 2*<hexOctet>
node                   = 6*<hexOctet>

Donc, supprimer - est correct, vous pouvez les réinsérer ultérieurement à l'emplacement correct si vous le souhaitez, ou recréer un objet UUID contenant les mêmes informations.

En ce qui concerne l'unicité: Quel est le caractère unique de l'UUID?

9
assylias

L'UUID est un nombre 128 bits.

Le format hexadécimal avec des traits d'union est uniquement un rendu d'affichage pour la consommation humaine. C'est l'un des rendus d'affichage possibles, et le format d'affichage, avec ou sans trait d'union, n'est PAS l'UUID lui-même.

8
Jim Garrison

L'UUID est un nombre 128 bits. Les quatre bits du chiffre M indiquent la version de l'UUID et les un à trois bits les plus significatifs du chiffre N indiquent la variante de l'UUID. Le codage binaire des UUID varie selon les systèmes. De nombreux systèmes encodent entièrement l'UUID dans un format big-endian.

1
Stefano