670 votes

L'UUID est-il unique ?

Dans quelle mesure est-il sûr d'utiliser l'UUID pour identifier quelque chose de façon unique (je l'utilise pour les fichiers téléchargés sur le serveur) ? Si je comprends bien, il est basé sur des nombres aléatoires. Cependant, il me semble qu'avec le temps, il finira par se répéter, par pur hasard. Existe-t-il un meilleur système ou un modèle quelconque pour pallier à ce problème ?

22 votes

Pour une valeur suffisamment grande de "suffisamment de temps" :)

134 votes

"A quel point l'UUID est-il unique ?" Universellement unique, je crois. ;)

45 votes

Et à moins que vous ne prévoyiez de développer sur Vénus, un GUID devrait suffire.

670voto

Très sûr :

le risque annuel pour une personne donnée d'être frappée par une météorite est estimé à une chance sur 17 milliards, ce qui signifie que la probabilité est d'environ 0,00000000006 (6 × 10 11 ), ce qui équivaut aux chances de créer quelques dizaines de trillions d'UUID en un an et d'en avoir un seul en double. duplicata. En d'autres termes, seulement après avoir généré 1 milliard d'UUIDs chaque seconde pendant les 100 prochaines années, la probabilité de créer un seul duplicata serait d'environ 50%.

Attention :

Cependant, ces probabilités ne sont valables que si les UUIDs sont générés en utilisant une entropie suffisante. Sinon, la probabilité de doublons pourrait être beaucoup plus élevée, puisque la dispersion statistique pourrait être plus faible. plus faible. Lorsque des identifiants uniques sont requis pour des applications distribuées, afin que les UUID n'entrent pas en conflit, même lorsque les données provenant de de nombreux dispositifs, le caractère aléatoire des graines et des générateurs utilisés sur chaque chaque dispositif doit être fiable pendant toute la durée de vie de l'application. Lorsque cela n'est pas possible, la RFC4122 recommande d'utiliser une variante d'espace de noms à la place.

Source : Le site UUID aléatoire probabilité de doublons section de l'article de Wikipédia sur les identifiants universels uniques (le lien mène à une révision de décembre 2016 avant que la rédaction ne remanie la section).

Voir également la section actuelle sur le même sujet dans le même article sur l'identifiant unique universel, Collisions .

45 votes

J'aime cette partie de Wikipedia : Cependant, ces probabilités ne tiennent que lorsque les UUID sont générés en utilisant une entropie suffisante. Dans le cas contraire, la probabilité de doublons pourrait être sensiblement plus élevée, car la dispersion statistique pourrait être plus faible. Alors quelle est la probabilité réelle de duplicata en notant cette phrase. Nous ne pouvons pas créer de véritables nombres aléatoires sur ordinateur, n'est-ce pas ?

7 votes

En fait, beaucoup d'efforts ont été déployés pour trouver des moyens d'introduire autant d'entropie (le "vrai hasard", je suppose que vous l'appelleriez) que possible dans les API de nombres aléatoires. Voir fr.wikipedia.org/wiki/Entropie_%28computing%29

8 votes

C'est en fait une probabilité de collision plus élevée que je ne l'avais imaginé. Le paradoxe de l'anniversaire, je suppose.

212voto

rein Points 15639

Si par "suffisamment de temps", vous entendez 100 ans et que vous les créez au rythme d'un milliard par seconde, alors oui, vous avez 50 % de chances d'avoir une collision après 100 ans.

245 votes

Mais seulement après avoir utilisé 256 exaoctets de stockage pour ces identifiants.

47 votes

Ce qui est drôle, c'est que vous pourriez en générer 2 d'affilée qui soient identiques, bien sûr à des niveaux de coïncidence, de chance et d'intervention divine hallucinants, mais malgré les chances insondables, c'est toujours possible ! D Oui, ça n'arrivera pas. Je le dis juste pour le plaisir de penser à ce moment où vous avez créé un double ! Vidéo de capture d'écran !

7 votes

L'unicité est-elle purement due au hasard ? Ou y a-t-il d'autres facteurs ? (par exemple, l'horodatage, l'adresse IP, etc.)

152voto

Hoylen Points 3842

Il existe plus d'un type d'UUID, donc le "degré de sécurité" dépend du type (que les spécifications UUID appellent "version") que vous utilisez.

  • La version 1 est l'UUID basé sur le temps plus l'adresse MAC. Les 128 bits contiennent 48 bits pour l'adresse MAC de la carte réseau (qui est attribuée de manière unique par le fabricant) et une horloge de 60 bits avec une résolution de 100 nanosecondes. Cette horloge enveloppé en 3603 A.D. Ces UUID sont donc en sécurité au moins jusqu'à cette date (sauf si vous avez besoin de plus de 10 millions de nouveaux UUID par seconde ou si quelqu'un clone votre carte réseau). Je dis "au moins" parce que l'horloge commence au 15 octobre 1582, donc vous avez environ 400 ans après que l'horloge se soit emballée avant qu'il y ait même une petite possibilité de duplications.

  • La version 4 est le numéro aléatoire UUID. Il y a six bits fixes et le reste de l'UUID est composé de 122 bits aléatoires. Voir Wikipedia ou d'autres analyses qui décrivent le caractère très improbable d'un doublon.

  • La version 3 utilise MD5 et la version 5 utilise SHA-1 pour créer ces 122 bits, au lieu d'un générateur de nombres aléatoires ou pseudo-aléatoires. Ainsi, en termes de sécurité, c'est comme si la version 4 était un problème statistique (tant que vous vous assurez que ce que l'algorithme de condensé traite est toujours unique).

  • La version 2 est similaire à la version 1, mais l'horloge est plus petite, de sorte qu'elle s'enroule beaucoup plus rapidement. Mais comme les UUID de la version 2 sont pour DCE, vous ne devriez pas les utiliser.

Donc, pour tous les problèmes pratiques, ils sont sûrs. Si vous n'êtes pas à l'aise avec les probabilités (par exemple, si vous êtes le type de personne qui craint que la Terre soit détruite par un gros astéroïde au cours de votre vie), assurez-vous simplement d'utiliser un UUID de version 1 et il est garanti unique (au cours de votre vie, à moins que vous ne prévoyiez de vivre au-delà de 3603 A.D.).

Alors pourquoi tout le monde n'utilise-t-il pas simplement les UUID de la version 1 ? Parce que les UUID de la version 1 révèlent l'adresse MAC de la machine sur laquelle ils ont été générés et qu'ils peuvent être prévisibles, deux éléments qui peuvent avoir des répercussions sur la sécurité de l'application qui les utilise.

1 votes

L'utilisation par défaut d'un UUID version 1 pose de sérieux problèmes lorsqu'ils sont générés par le même serveur pour de nombreuses personnes. L'UUID version 4 est ma valeur par défaut car vous pouvez rapidement écrire quelque chose pour en générer un dans n'importe quel langage ou plateforme (y compris javascript).

1 votes

@Hoylen Bien expliqué ! mais faut-il tant d'exagération ?

4 votes

Théoriquement il est attribué de manière unique par le fabricant.

26voto

Matt Points 8168

La réponse à cette question peut dépendre en grande partie de la version de l'UUID.

De nombreux générateurs d'UUID utilisent un numéro aléatoire version 4. Cependant, beaucoup d'entre eux utilisent un générateur de nombres pseudo-aléatoires pour les générer.

Si un PRNG mal ensemencé avec une petite période est utilisé pour générer l'UUID, je dirais que ce n'est pas très sûr du tout. Certains générateurs de nombres aléatoires ont également une mauvaise variance, c'est-à-dire qu'ils favorisent certains nombres plus souvent que d'autres. Cela ne fonctionnera pas bien.

Par conséquent, sa sécurité dépend des algorithmes utilisés pour le générer.

D'un autre côté, si vous connaissez la réponse à ces questions, je pense qu'un uuid version 4 devrait être très sûr à utiliser. En fait, je l'utilise pour identifier des blocs sur un système de fichiers en réseau et jusqu'à présent, je n'ai pas eu de problème.

Dans mon cas, le PRNG que j'utilise est un mersenne twister et je fais attention à la façon dont il est ensemencé, qui provient de plusieurs sources dont /dev/urandom. Le mersenne twister a une période de 2^19937 1. Il va falloir un très très long moment avant de voir un uuid répété.

Choisissez donc une bonne bibliothèque ou créez-la vous-même et veillez à utiliser un algorithme PRNG décent.

21voto

lost Points 223

Pour UUID4, je fais en sorte qu'il y ait approximativement autant d'identifiants que de grains de sable dans une boîte cubique de 360 000 km de côté. C'est une boîte dont les côtés sont ~2 fois et demie plus longs que le diamètre de Jupiter.

Travailler pour que quelqu'un puisse me dire si j'ai raté des unités :

  • volume du grain de sable 0.00947mm^3 ( Gardien )
  • UUID4 a 122 bits aléatoires -> 5.3e36 valeurs possibles ( wikipedia )
  • volume de ce nombre de grains de sable = 5.0191e34 mm^3 ou 5.0191e+25m^3
  • longueur latérale d'une boîte cubique de ce volume = 3,69E8m ou 369 000km
  • diamètre de Jupiter : 139 820 km (google)

3 votes

En fait, je suppose que cela suppose un emballage à 100%, alors peut-être que je devrais ajouter un facteur pour cela !

7 votes

C'est en fait très utile et ça m'a fait réaliser que c'est probablement bien et qu'il y a d'autres choses dont il faut s'inquiéter. lmao

0 votes

Cela suppose que la boite est pleine de sable. vous devez spécifier toutes vos hypothèses

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X