2011-12-27 13 views
24

Duplicar posibles:
Is a GUID unique 100% of the time?
Simple proof that GUID is not unique¿Cuáles son las posibilidades de obtener un duplicado Guid.NewGuid()?

En MSDN se puede leer:

The chance that the value of the new Guid will be all zeros or equal to any other Guid is very low.

decir que usted tiene un método que va a crear un archivo de todas las segundo, y usas el método Guid.NewGuid() para nombre de archivo, ¿es posible obtener el mismo Guid entonces? ¿O la computadora local realizará un seguimiento de alguna manera? ¿Qué tan baja es la oportunidad?

+13

Aproximadamente 1 de cada 2^128. – tenfour

+0

No, la computadora no realiza un seguimiento. Pero no, las posibilidades de un GUID duplicado son tan bajas que no son relevantes. Ya has respondido tu propia pregunta en la pregunta; todas las respuestas están repitiendo eso. –

+0

@CodyGray específico para el contexto del OP, el sistema * no * realiza un seguimiento. El sistema de archivos hará un seguimiento de cada GUID que se haya utilizado para este fin, y no le permitirá crear un archivo con un nombre idéntico. Entonces, básicamente, si el OP escribe un buen código, la respuesta es que no importa si hay colisiones o no. – tenfour

Respuesta

15

Nunca se quedarán sin guids. La probabilidad de que duplicarlos es muy bajo:

http://betterexplained.com/articles/the-quick-guide-to-guids/

+1

No estoy de acuerdo con esto, ya que no es muy bajo. Tengo un ejemplo práctico de ello, http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time/21570510#21570510 – vikas

29

Las posibilidades de obtener dos guías idénticas son astronómicamente escasas incluso si está generando guías lo más rápido que puede. (Generando, digamos, miles de guids por segundo con el único propósito de encontrar un duplicado).

Por supuesto, si quiere mi opinión, creo que habrá un momento, en un par de miles de años a partir de ahora, cuando colonizaremos la galaxia, nuestra población estará en billones, y la cantidad de computadoras individuales incrustadas en todas partes se contará en millones de millones, cuando comenzaremos a tener problemas con guiones duplicados apareciendo de vez en cuando en áreas distantes de la galaxia, y luego será como 640k de memoria de nuevo, DLL infierno una vez más, bicho del milenio de dos dígitos una vez más, todos combinados.

Lo que ocurre con los GUID es que no queremos que sean enormes, porque entonces serían un desperdicio, por lo que alguien tenía que encontrar una cantidad de bits lo suficientemente pequeña como para no ser demasiado inútil y, sin embargo, grande suficiente para dar una garantía razonable contra colisiones. Entonces, es un compromiso tecnológico. En nuestro siglo, 128 bits parecen ser un buen compromiso, pero con certeza casi matemática habrá otro siglo en que este compromiso ya no será tan bueno.

+0

En ese momento tendremos procesadores cuánticos capaces de operaciones cuanarias y multitarea real y no creo que ya nos preocupemos por las guías. También es probable que tengamos Internet cuántico que utiliza Quantum Entanglement para transmitir datos y tendremos un universo que abarca Internet con latencia de 10 ms desde cualquier punto a punto. También es muy posible que tengamos unidades warp (doblamos espacio para obtener FTL ...) –

+0

Me temo que nuestra capacidad de comunicarnos más rápido solo hará que las colisiones GUID sean un fenómeno más frecuente. –

+0

¿Miles de años? Con el modelo actual, hay suficientes GUID para caber ~ 800 millones de GUIDS por nanosegundo durante los últimos 13.800 millones de años. Incluso si obtenemos cuatrillones de computadoras, cada una de las cuales crea miles de millones de GUID por segundo, el riesgo será insignificante durante mucho tiempo. Si realmente habrá un día en el que podría ser un riesgo, tendríamos milenios para prepararnos para un nuevo estándar con, por ejemplo, 4096 bits. –

1

Por favor lea la siguiente pregunta para obtener información acerca de las colisiones: Are GUID collisions possible?

En cuanto a la "uno guid por segundo", guids generados suelen tener en cuenta el tiempo, por lo que en el mismo equipo, 0 oportunidad de generar el mismo GUID menos cambia los ajustes del reloj interno

edición: al parecer the wikipedia page sobre guids dice que el tiempo no es obligatorio en la construcción de un GUID, así que supongo que depende del algoritmo utilizado. Como estamos hablando de C# (¿en Windows?), De hecho es UUID, que incluye en algunas versiones.

0

Definitivamente se quedará sin espacio en el disco o atascará el sistema de archivos antes de que los GUID colisionen. Simplemente maneje los errores al crear archivos con elegancia y estará bien.

8

siempre hay algún minúsculo oportunidad de duplicados, pero identificadores únicos globales están destinados a ser sólo eso: a nivel mundial única ... no es único, pero como en todo el sistema en el planeta tierra única.

Supongo que, teóricamente, tiene más posibilidades de duplicar un UUID en varios sistemas que en un sistema único. Si bien el sistema operativo no va a almacenar cada GUID que genera, probablemente utilice algunos datos de inicialización basados ​​en el tiempo para evitar colisiones en sí mismo. Por supuesto, esto depende de la implementación.

Ah, y es posible ... bueno, hay 3.4 x 10^38 disponibles, Wikipedia dice que es más probable que te golpee un meteorito.

También ofreceré un método alternativo, vale la pena investigar el método Path.GetTempFileName(), porque tiene protección contra colisión ... aunque solo puede crear 65.535 nombres de archivo únicos antes de lanzar una excepción si los archivos anteriores no son válidos. t borrado.

Aparte de eso, no es muy difícil de hacer:

string path; 

do 
{ 
    path = Guid.NewGuid().ToString(); // Format as needed 

} while (File.Exists(path)); 
+1

me hace sentir mejor que hayas salido de allí ¡siendo solo un sistema para el planeta tierra único! Todavía estoy paranoico sobre el hecho de que no es 100% seguro.Preferiría comprobar el DB para ver si existe, pero sé que eso causa más sobrecarga ... – ozzy432836

Cuestiones relacionadas