155 votes

Collisions de GUID sont possibles ?

Je travaille sur une base de données dans SQL Server 2000 qui utilise un GUID pour chaque utilisateur qui utilise l’application à qu'il est lié. En quelque sorte, deux utilisateurs ont fini avec le même GUID. Je sais que microsoft utilise un algorithme pour générer un GUID aléatoire qui a un très faible risque de provoquer des coups, mais une collision se produit encore possible ?

155voto

Tom Ritter Points 44352

En gros, pas de. Je pense que quelqu'un est allé coucher avec votre base de données. Selon la version GUID vous utilisez la valeur est unique (pour des choses comme la version 1 Guid), ou à la fois unique et imprévisible (pour des choses comme la version 4 Guid). SQL Server de la mise en œuvre de leur fonction NEWID() apparaît à utiliser un cryptage de 128-bit nombre aléatoire, de sorte que vous n'allez pas pour obtenir une collision.

Pour un 1% de chance de collision, vous aurez besoin de générer environ 2,600,000,000,000,000,000 de Guid.

122voto

Pop Catalin Points 25033

En gros, ils ne sont pas possible !, les chances sont astronomiquement faible.

Mais... je suis la seule personne que j'ai le monde que je connais, qui avait un GUID colision une fois (eh oui!).

Et, j'en suis sûr, et que ce n'était pas une erreur.

Comment se fait-il, dans une petite application qui a été en cours d'exécution sur le PC de Poche, à la fin d'une opération d'une commande qui a généré un GUID doit être émis. La commande après qu'il a été exécuté sur le serveur, il a été stocké dans un tableau de commande sur le serveur ainsi que la date d'exécution. Un jour, quand j'étais débogage, j'ai lancé le module de commande (avec le nouvellement généré GUID associé) et rien ne s'est passé. I did it again (avec le même guid, car le guid a été généré une seule fois au début de l'opération), et encore, et rien, enfin essayer de savoir pourquoi la commande n'est pas en cours d'exécution, j'ai vérifié sur le tableau de commande, et le même GUID que l'actuel a été insérée il y a 3 semaines. Ne pas croire cela, j'ai restauré une base de données à partir de 2 semaines de sauvegarde, et le guid était là. Vérifié le code, le nouveau guid a été fraîchement généré aucun doute à ce sujet. Pow guid collision, est arrivé qu'une seule fois, mais je souhaite vraiment que j'aurais gagné au loto au lieu de cela,la chance est plus grande :).

Edit: il y a certains facteurs qui pourraient avoir considérablement augmenté les chances que cela se produise, l'application est en cours d'exécution sur le PocketPC émulateur, et l'émulateur a enregistrer l'état de la fonctionnalité, ce qui signifie que chaque fois que l'état est restauré à l'heure locale est de restauré aussi et le guid est basé sur l'horloge interne....aussi le guid de la génération de l'algorithme pour le compact framework peut-être moins complète que par exemple la COM...

40voto

Ben Hoffstein Points 44398

Ils sont théoriquement possibles, mais avec 3.4E38 chiffres possibles, si vous créez des dizaines de milliers de milliards de GUID dans un an la chance d’avoir un duplicata est 0.00000000006 (Source).

Si deux utilisateurs s’est retrouvé avec le même GUID, je parierais qu’il y a un bug dans le programme qui est à l’origine les données à être copié ou partagé.

25voto

Greg Beech Points 55270

D'abord, permet de regarder la chance de la collision de deux Guid. Il n'est pas, comme d'autres réponses ont déclaré, 1 à 2^128 (10^38) en raison de l' anniversaire paradoxe, ce qui signifie que pour une chance de 50% de deux Guid de la collision, la probabilité est en fait 1 à 2^64 (10^19), ce qui est beaucoup plus petit. Cependant, c'est toujours un très grand nombre, et, comme telle, la probabilité d'une collision en supposant que vous utilisez un nombre raisonnable de Guid est faible.

Notez également que le Guid ne contiennent pas un timestamp ou l'adresse MAC comme beaucoup de gens semblent le croire. Cela a été vrai pour v1 Guid, mais maintenant v4 Guid sont utilisés, qui sont tout simplement un nombre pseudo-aléatoire qui signifie que la possibilité d'une collision est sans doute plus, car ils sont plus propres à une époque et d'une machine.

Donc, essentiellement, la réponse est oui, les collisions sont possibles. Mais ils sont très rare.

Edit: fixe-à-dire 2^64

18voto

Tony Lee Points 3388

Les chances de deux GUID aléatoire en collision (1 ~ 10 ^ 38) est inférieure à la chance de ne pas détecter un paquet TCP/IP corrompu (1 ~ 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf, page 11. Ceci est également vrai des disques durs, lecteurs de cd, etc....

GUID sont statistiquement unique et les données que vous lire depuis la base de données ne soient statistiquement correctes.

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