¿Es seguro asumir que un GUID siempre será único?


123

Sé que hay una posibilidad mínima de un choque, pero si genero un lote de 1000 GUID (por ejemplo), ¿sería seguro asumir que todos son únicos para guardar la prueba de cada uno?

Pregunta extra

¿Una manera óptima de probar un GUID para la unicidad? ¿Filtro de floración tal vez?



29
No si todos seguimos presionando el botón de recarga en este sitio: wasteaguid.info
mipadi

12
Culpo a todos mis errores de colisiones GUID. Tiene que pasar algún tiempo ¿verdad?
Michael

8
Es mucho más probable que un tiburón con un hermoso color a cuadros caiga del cielo y rompa su computadora en pedazos, por lo que diría que tomar precauciones contra eso es una asignación más adecuada de recursos como parte de su reducción general de riesgos plan.
David Gladfelter

44
@mipadi: ¡gran enlace! Yo sólo puedo imaginar alguna en algún desarrollador lloriqueo "Guuuuys! Deje de perder los GUID! Yo necesito esos!"
FrustratedWithFormsDesigner

Respuestas:


360

Sí tu puedes. Dado que los GUID tienen 128 bits de largo, hay una posibilidad mínima de un choque, pero la palabra "minuto" no es lo suficientemente fuerte. Hay tantos GUID que si genera varios billones de ellos al azar, aún es más probable que sea golpeado por un meteorito que incluso tener una colisión (de Wikipedia ). Y si no los está generando al azar, pero está utilizando, por ejemplo , el algoritmo de dirección MAC y marca de tiempo, entonces también serán únicos, ya que las direcciones MAC son únicas entre las computadoras y las marcas de tiempo son únicas en su computadora.

Edición 1: para responder a su pregunta adicional, la forma óptima de probar un conjunto de GUID para la unicidad es simplemente asumir que todos son únicos. ¿Por qué? Porque, dada la cantidad de GUID que está generando, las probabilidades de una colisión de GUID son menores que las probabilidades de que un rayo cósmico se voltee un poco en la memoria de su computadora y arruine la respuesta dada por cualquier algoritmo "preciso" que le interese correr. (Vea esta respuesta de StackOverflow para las matemáticas).

Hay una enorme cantidad de GUID por ahí. Para citar la Guía del autoestopista de la galaxia de Douglas Adams :

"El espacio", dice, "es grande. Realmente grande. Simplemente no vas a creer lo enormemente alucinante que es. Quiero decir que puedes pensar que es un largo camino hacia el químico, pero eso es solo maní al espacio , escucha…"

Y dado que hay alrededor de 7 × 10 22 estrellas en el universo , y poco menos de 2 128 GUID, entonces hay aproximadamente 4,86 ​​× 10 15, casi cinco billones, de GUID para cada estrella. Si cada una de esas estrellas tuviera un mundo con una población próspera como la nuestra, entonces, alrededor de cada estrella, cada humano o alienígena que haya vivido tendrá derecho a más de cuarenta y cinco mil GUID. Para cada persona en la historia en cada estrella del universo. El espacio GUID está en el mismo nivel de inmensidad que el tamaño de todo el universo. Usted no necesita preocuparse.

( Edición 2: Al reflexionar sobre esto: wow no me había dado cuenta. A mí mismo lo que este espacio GUID El significado es incomprensible masiva Soy una especie de en el temor de él...)


1
Además, WolframAlpha informa que, por cada célula en cada persona que ha vivido, hay 36 billones de UUID. Tienes alrededor de 10^14células en tu cuerpo, y 106.5 billones de personas han vivido. O, 2.385 * 10^23UUID por cada centavo en la deuda pública de los Estados Unidos.
nuevo123456

55
Aunque los números siguen siendo altos, las posibilidades de una colisión de GUID son superiores al 50% a 2 ^ 64 GUID.
NullUserException

1
Con 2 ^ 64 GUID, esto reduciría los números a menos de uno (0.00026) por estrella en el Universo y 2 * 10 ^ (- 15) por cada humano o alienígena que haya vivido. Esto aún permitiría más de 170 millones de GUID por cada humano que haya vivido, así que creo que aún somos buenos.
NullUserException

12
Vale la pena señalar que una colisión GUID también es solo un problema si está en el mismo espacio comercial. Un GUID que uso para identificar un componente en una pieza de software podría ser el mismo que un GUID que usa en una fila de la base de datos en su propia aplicación sin causar ningún problema
James Thorpe

1
El hecho de que haya 2 ^ 128 GUID es irrelevante, y no eres "bueno" con un 50% de posibilidades de colisión, ni siquiera eres bueno con 0.0000001%
BlackTigerX

40

Respuesta corta: para fines prácticos, sí.

Sin embargo, ¡debes considerar la paradoja del cumpleaños!

He calculado algunas probabilidades representativas de colisión. Con UUID de 122 bits como se especifica en el artículo de Wikipedia , la probabilidad de colisión es de 1/2 si genera al menos 2.71492e18UUID. Con 10 ^ 19 UUID, la probabilidad es 0.999918. Con 10 ^ 17 UUID, 0.000939953.

Algunos números para comparar se pueden encontrar en Wikipedia. Por lo tanto, puede asignar con seguridad un UUID para cada humano que ha vivido, cada galaxia en el universo observable, cada pez en el océano y cada hormiga individual en la Tierra. Sin embargo , las colisiones son casi seguras si genera un UUID para cada transistor que la humanidad produce en un año, cada insecto en la Tierra, cada grano de arena en la Tierra, cada estrella en el universo observable o cualquier cosa más grande.

Si genera mil millones de UUID por segundo, tomaría unos 36 años obtener una probabilidad de colisión del 10%.

Eventualmente, probablemente habrá una colisión entre el conjunto de UUID generados en el transcurso de la historia humana. Aún así, la probabilidad de que los UUID colisionados se usen para el mismo propósito es muy pequeña, por lo que no hay problema en la práctica.


13
Así es como termina el universo ... Algunos programadores simplemente suponen que sus GUID siempre serán únicos para su mega Estrella de la Muerte ...
pkr298

Debido a que los UUID se basan en datos no aleatorios, 36 años es: solo tiene que preocuparse por cada milisegundo individualmente.
mjaggard

Los UUID @mjaggard se basan en datos aleatorios. Cualquier tipo moderno, de todos modos.
Trejkaz

8

Un análisis de la posibilidad de colisión está disponible en Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

Como se menciona en el enlace, esto se verá afectado por las propiedades del generador de números aleatorios.

También existe la posibilidad de un error en el código del generador GUID; Si bien las posibilidades son bajas, probablemente sean más altas que las posibilidades de una colisión basada en las matemáticas.

Un filtro Bloom podría ser apropiado; puede decirle rápidamente si un GUID es único, pero existe la posibilidad de una indicación falsa de una colisión. Un método alternativo si está probando un lote a la vez es ordenar el lote y comparar cada elemento sucesivo.


5

En general, sí, es seguro asumirlo.

Si su generador de GUID es verdaderamente aleatorio, las posibilidades de un choque dentro de 1000 GUID son extraordinariamente pequeñas.

Por supuesto, eso supone un buen generador de GUID. Entonces, la pregunta es realmente cuánto confía en la herramienta que está utilizando para generar GUID y ¿tiene sus propias pruebas?


0

Si bien es posible una colisión, es ALTAMENTE improbable. (Matemáticas aquí .) Es seguro asumir que de hecho son distintos.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.