134 votes

Quand êtes vous vraiment obligés d’utiliser UUID dans le cadre de la conception ?

Je ne vois vraiment pas le point de UUID. Je sais que la probabilité de collision est effectivement nulle, mais effectivement nulle n'est même pas impossible.

Quelqu'un peut-il donner un exemple où vous n'avez pas d'autre choix que d'utiliser l'UUID? De toutes les utilisations que j'ai vu, je peux voir une autre conception sans UUID. Assurez-vous que le design pourrait être un peu plus compliqué, mais au moins il n'a pas une probabilité non nulle de l'échec.

UUID sent comme des variables globales pour moi. Il existe de nombreuses façons variables globales faire pour simplifier la conception, mais son paresseux de la conception.

659voto

Bob Aman Points 19110

J'ai écrit l'UUID générateur/analyseur de Ruby, donc je me considère raisonnablement bien informée sur le sujet. Il y a quatre grands UUID versions:

La Version 4 Uuid sont essentiellement juste 16 octets de l'aléatoire tiré à partir d'un point de vue cryptographique sécurisé générateur de nombre aléatoire, avec quelques bits-tourner à identifier l'UUID de la version et de la variante. Ceux-ci sont extrêmement peu de chances d'entrer en collision, mais il pourrait arriver si un GÉNÉRATEUR est utilisé ou s'il se trouve que vous avez vraiment, vraiment, vraiment, vraiment, vraiment de la malchance.

La Version 5 et la Version 3 Uuid utiliser le SHA1 et MD5 fonctions de hachage, respectivement, de combiner un espace de noms avec un morceau de déjà unique de données pour générer un UUID. Cela permettra, par exemple, permettent de produire un UUID à partir d'une URL. Les Collisions ici ne sont possibles que si le sous-jacent en fonction de hachage dispose également d'une collision.

Version 1 Uuid sont les plus courants. Ils utilisent le réseau de l'adresse MAC de la carte (qui, sauf usurpée, doit être unique), en plus d'un timestamp, en plus de la traditionnelle bits-tourner à générer l'UUID. Dans le cas d'une machine qui ne dispose pas d'une adresse MAC, le nœud 6 octets sont générés avec une cryptographique sécurisé générateur de nombre aléatoire. Si deux Uuid sont générés dans la séquence assez vite pour que le timestamp correspond à la précédente UUID, l'horodatage est incrémenté de 1. Les Collisions ne devrait pas se produire à moins que l'une des situations suivantes se produit: L'adresse MAC est falsifié; Une machine de course de deux UUID de la génération d'applications produit Uuid exactement au même moment, Deux machines sans une carte réseau ou sans accès au niveau utilisateur à l'adresse MAC sont donné le même nœud aléatoire de la séquence, et de générer des Uuid exactement au même moment; Nous sommes à court d'octets pour représenter l'horodatage et la substitution de retour à zéro.

De façon réaliste, aucun de ces événements se produisent par accident au sein d'une seule application de l'ID de l'espace. Sauf si vous êtes accepter Id sur, disons, de l'Internet, à l'échelle de l'échelle, ou avec un environnement non sécurisé où des personnes malveillantes qui pourraient être en mesure de faire quelque chose de mauvais dans le cas d'une collision d'ID, c'est pas juste quelque chose qui devrait vous inquiéter. Il est essentiel de comprendre que si vous arrivez à générer la même version 4 UUID comme je le fais, dans la plupart des cas, il n'a pas d'importance. J'ai généré le code dans un de complètement différent de l'ID de l'espace de la vôtre. Ma demande ne pourra jamais savoir à propos de la collision de sorte que la collision n'a pas d'importance. Franchement, en un seul espace d'application sans acteurs malveillants, l'extinction de toute vie sur terre va se produire à long avant d'avoir une collision, même sur une version 4 UUID, même si vous êtes à la production un peu Uuid par seconde.

Aussi, 2^64 * 16 est de 256 exaoctets. Comme dans, vous avez besoin de stocker 256 exaoctets valeur de l'Id avant d'avoir une chance de 50% d'un ID de collision dans un seul espace d'application.

73voto

Michael Burr Points 181287

La chose qui l'Uuid d'acheter, vous qu'est très difficile de faire autrement est d'obtenir un identifiant unique , sans avoir à consulter ou à coordonner avec une autorité centrale. Le problème général d'être en mesure d'obtenir une telle chose sans une sorte de gestion de l'infrastructure est le problème de l'Uuid de résoudre.

J'ai lu que, selon le paradoxe d'anniversaire à l'occasion d'un UUID collision survenant est de 50% après 2^64 Uuid ont été générés. Maintenant 2^64 est un assez grand nombre, mais 50% de risque de collision semble beaucoup trop risqué (par exemple, combien d'Uuid doivent exister avant il y a 5% de chance de collision - même qui semble trop grand d'une probabilité).

Le problème avec cette analyse est double:

  1. Uuid ne sont pas totalement aléatoires - là sont des composantes majeures de l'UUID que sont le temps et/ou de localisation. Donc, pour avoir de réelles chances d'une collision, la collision des Uuid besoin de tobe généré à exactement le même temps de différents UUID générateurs. Je dirais que si il ya une chance raisonnable que plusieurs UUID peut être généré dans le même temps, il y a assez d'autres crasse (y compris les informations de localisation ou de bits aléatoires) pour faire de la likeyhood de collision entre ce très petit ensemble de Uuid presque impossible.

  2. strictement parlant, Uuid seulement besoin d'être unique parmi l'ensemble des autres Uuid qu'ils pourraient être comparées. Si vous êtes de la génération d'un UUID pour l'utiliser comme une clé de base de données, il n'a pas d'importance si quelque part d'autre dans un mal autre univers que le même UUID est utilisé pour identifier une interface COM. Tout comme il va entraîner aucune confusion si il y a quelqu'un (ou quelque chose) d'autre nommée "Michael Bavure" sur Alpha du centaure.

38voto

DanSingerman Points 17301

Tout a une chance non nulle d’échec. J’ai se concentrerait sur beaucoup plus probablement se pour produire des problèmes (c'est-à-dire presque tout ce que vous pouvez penser) que la collision de l’UUID

17voto

Rex M Points 80372

Un accent sur le "raisonnable" ou, comme vous le dites, "effectivement": assez bon est de savoir comment fonctionne le monde réel. Le montant des travaux informatiques impliqués dans la couverture de l'écart entre "pratiquement unique" et "unique" est énorme. L'unicité est une courbe avec des rendements décroissants. À un certain point sur la courbe, il y a une frontière entre "assez unique" est encore abordable, et puis nous avons de la courbe avec une pente TRÈS raide. Le coût de l'ajout de plus d'unicité devient assez grand. Infini unicité a coût infini.

UUID/GUID est, relativement parlant, un calcul rapide et facile de générer un code qui peut être raisonnablement supposé être universellement unique. Ceci est très important dans de nombreux systèmes qui ont besoin d'intégrer des données à partir des systèmes non connectés. Par exemple: si vous avez un Système de Gestion de Contenu qui fonctionne sur les deux plates-formes différentes, mais à un certain point besoin d'importer le contenu d'un système à l'autre. Vous ne voulez pas les Id de changer, de sorte que vos références entre les données du système restent intacts, mais vous ne voulez pas de collisions avec les données créées dans le système B. UN UUID résout ce problème.

16voto

John Gietzen Points 23645

Il n'est jamais absolument nécessaire de créer un UUID. Il est cependant utile d'avoir une norme, si hors ligne, les utilisateurs peuvent générer une clé à quelque chose avec une très faible probabilité de collision.

Cela peut aider dans la base de données de réplication de la résolution, etc...

Il serait facile pour en ligne aux utilisateurs de générer des clés uniques pour quelque chose sans la surcharge ou la possibilité de collision, mais ce n'est pas ce que l'Uuid sont pour.

De toute façon, un mot sur la probabilité de collision, tirée de Wikipedia:

Pour mettre ces chiffres en perspective, un annuel de risque d'être atteint par une météorite est estimée à une chance sur 17 milliards de dollars, soit l'équivalent à la cote de la création de quelques dizaines de milliers de milliards de Uuid dans un an et avoir un doublon. En d'autres termes, seulement après avoir généré 1 milliard de dollars Uuid de chaque seconde pour les 100 prochaines années, la probabilité de création d' juste un doublon serait d'environ 50%.

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