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.