L'UUID de risque de collision à l'aide de différents algorithmes
J'ai une base de données où les 2 (ou peut-être 3 ou 4), les différentes applications sont l'insertion d'informations. Les nouvelles informations Id de type GUID/UUID, mais chaque application utilise un algorithme différent pour générer les Identifiants. Par exemple, l'un est à l'aide de la NHibernate est "guid.peigne", d'autre est à l'aide de la SQLServer NEWID(), d'autres pourraient vouloir l'utiliser .NET Guid.NewGuid() de la mise en œuvre.
Est-il au-dessus de la normale risque de collision d'ID ou de doublons?
Merci!
Vous devez vous connecter pour publier un commentaire.
Le risque de collision est élevé légèrement, mais encore extrêmement petite. Considérer que:
À la fois Peigne et
NEWID
/NEWSEQUENTIALID
comprennent un horodatage avec une précision de quelques ms†. Donc, sauf si vous êtes de la génération d'un grand nombre de papiers d'identité à la exactement le même moment du temps de l'ensemble de ces différentes sources, il est littéralement impossible pour l'Id d'entrer en collision.La partie de la GUID n'est pas basé sur l'horodatage peut être considéré comme aléatoire; la plupart des GUID algorithmes de base de ces chiffres sur un PRNG. Ainsi, la probabilité de collision entre ces autres 10 octets ou alors c'est du même ordre que si vous avez utilisé deux générateurs de nombres aléatoires et regardé pour les collisions.
Penser à ce sujet pendant un moment - PRNGs et ne peut répéter les numéros, de sorte que la probabilité d'une collision entre deux d'entre eux n'est pas significativement supérieur à celui d'une collision à l'aide de l'un d'entre eux, même s'ils utilisent des algorithmes légèrement différents. C'est un peu comme jouer les mêmes numéros de loterie chaque semaine vs de choisir un ensemble aléatoire chaque semaine, les chances de gagner sont exactement les mêmes dans les deux cas.
Maintenant, gardez à l'esprit que lorsque vous utilisez un algorithme de type Guid.Peigne, vous n'avez que 10 bits d'indicateur d'unicité, ce qui équivaut à 1024 valeurs distinctes. Donc, si vous êtes de la génération d'un grand nombre de Guid dans le même quelques millisecondes, vous sera obtenir des collisions. Mais si vous générer des Guid à relativement basse fréquence, il n'a pas vraiment d'importance combien de différents algorithmes que vous utilisez dans le même temps, la probabilité d'une collision est encore pratiquement inexistante.
La meilleure façon pour vous d'être absolument certain, c'est l'exécution d'un test; ont tous les 2 ou 3 (ou cependant beaucoup que vous utilisez) la génération de Guid, dans le même temps, à intervalles réguliers, et de les écrire dans un fichier journal, et voir si vous obtenez des collisions (et si oui, combien). Cela devrait vous donner une bonne idée de la façon sûre c'est dans la pratique.
P. S. Si vous utilisez NHibernate peigne générateur pour générer des Guid pour un cluster de clé primaire, pensez à utiliser
NEWSEQUENTIALID()
au lieu deNEWID()
- le point de l'ensemble de Peigne afin d'éviter le fractionnement des pages, et vous n'êtes pas accomplir que si vous avez d'autres processus à l'aide de non-séquentielle des algorithmes. Vous devez aussi changer le code en utilisantGuid.NewGuid
d'utiliser le même générateur de Peigne - l'Peigne algorithme utilisé dans NHibernate est pas compliqué et facile à reproduire dans votre propre nom de domaine logique.† Note qu'il semble y avoir un différend au sujet de
NEWID
, et si oui ou non il contient un horodatage. En tout cas, puisqu'il est basé sur l'adresse MAC, l'intervalle des valeurs possibles est beaucoup plus petit qu'un V4 GUID ou d'un Peigne. Raison de plus pour moi de recommander coller à Peigne Guid à l'extérieur de la base de données etNEWSEQUENTIALID
à l'intérieur de la base de données.NEWID
est horodatage base, parce que la documentation est rare, mais autant que je sache, il est basé sur la V1 de le GUID de l'algorithme qui utilise un horodatage. Et l'horodatage octets pour Peigne etNEWSEQUENTIALID
doit être le même octets, sinon ils ne seraient pas en fait être séquentielle. (Ils utilisent différentes tailles pour l'heure, oui, mais la petite taille de 10 octets et donc le résultat sera toujours sans collision pour l'insertion des fréquences en dessous de 3.33 ms).NEWID()
génère son ID, il est préférable d'utiliserNEWSEQUENTIALID
sur le serveur si vous prévoyez d'utiliser des Peignes sur le client.NEWID
est un RFC4122 V4 GUID (complètement au hasard, sauf pour les 6 bits qui font RFC4122-conforme).NEWSEQUENTIALID
est une V1 GUID, mais les swaps de nombreux de ses octets pour tenir compte de SQL Server est fou de commande de Guid. Alors queNEWSEQUENTIALID
Guid sont en fait séquentielle, Peigne les Guid sont souvent pas. Ils n'utilisent pas les mêmes octets pour leurs horodateurs;NEWSEQUENTIALID
Guid ont horodateurs dans leur premier groupe, encore Peigne Guid de les placer dans leur dernier groupe. Voir les liens mon blog pour les détails sanglants.Oui, le risque est supérieur à la normale, parce que tous ceux-ci utilisent des définitions différentes de "GUID." Guid.NewGuid() est conforme à la RFC surtout-GUID aléatoire, mais NEWSEQUENTIALID est un réorganisées (et donc non-conformes à la RFC) GUID basé sur l'adresse MAC et de l'heure, et NHibernate peigne GUID est complètement différent (basé sur l'aléatoire et timestamp).
Vous pouvez envisager de la standardisation d'un GUID de mise en œuvre. J'utilise mon propre type de peigné GUID pour toutes mes applications. Mon blog a une brève description de tous ces types de Guid le long de avec les décisions de conception pour mon propre.