2010-06-04 14 views
71

Sé que hay una pequeña posibilidad de un choque, pero si generase un lote de 1000 GUID (por ejemplo), ¿sería seguro asumir que son únicos para guardar cada uno de ellos?¿Es seguro asumir que un GUID siempre será único?

Bono pregunta

una manera óptima para probar un GUID para la unicidad? ¿Filtro Bloom tal vez?

+2

posible duplicado de [¿Es un GUID único el 100% de las veces?] (Http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time) – ChrisF

+20

No si todos seguimos machacando el botón de recarga en este sitio: http://www.wasteaguid.info/ – mipadi

+9

Culpo a todos mis errores en las colisiones GUID. Tiene que pasar algún tiempo, ¿verdad? – Michael

Respuesta

257

Sí, se puede. Como 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 aleatoriamente, todavía tiene más probabilidades de ser alcanzado por un meteorito que tener incluso una colisión (desde Wikipedia). Y si no los está generando al azar, sino que son , p. usando el algoritmo MAC-dirección-y-marca-de-tiempo, entonces también van a ser únicos, ya que las direcciones MAC son únicas entre las computadoras y las marcas de tiempo son únicas en su computadora.

Editar 1: Para responder a su pregunta de bonificación, 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 GUID son menores que las probabilidades de que un rayo cósmico se mueva un poco en la memoria de su computadora y arruine la respuesta dada por cualquier algoritmo "preciso" que le interese correr. (Consulte this StackOverflow answer para las matemáticas).

Hay un número enorme de de GUID. Para citar la Guía del autostopista de Douglas Adams para el Galaxy:...

"espacio", dice, "es grande realmente grande Usted simplemente no vas a creer lo enormemente enormemente mindbogglingly grande que es quiero decir que puede pensar que es un largo camino en el camino a la farmacia, pero eso es sólo cacahuetes al espacio, escucha ..."

y puesto que hay about 7×1022 stars in the universe, y poco menos de 2 GUID, entonces hay aproximadamente 4,86 ​​× 10 -casi five quadrillion -GUID para cada estrella individual.Si cada una de esas estrellas tuviera un mundo con una población próspera como la nuestra, entonces alrededor de cada una de las estrellas, every human or alien who had ever lived tendrían derecho a más de cuarenta y cinco mil GUID. Para cada persona en la historia en cada estrella en el universo. El espacio GUID está en el mismo nivel de envergadura que el tamaño del universo entero. Usted lo hace no necesita preocuparse.

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

+68

+1 para citar Hitchhikers –

+0

Además, WolframAlpha informa que, por cada celda de cada persona que haya vivido, hay 36 billones de UUID. Tienes aproximadamente 10^14 células en tu cuerpo, y 106.5 billones de personas han vivido alguna vez. O bien, '2.385 * 10^23' UUID por cada centavo en la deuda pública de los Estados Unidos. – new123456

+4

Aunque los números siguen siendo altos, las posibilidades de una colisión GUID son más del 50% en 2^64 GUID. – NullUserException

0

Mientras que una colisión es posible, es ALTAMENTE improbable. (Matemáticas here.) Es seguro asumir que son de hecho distintos.

5

En general, sí, es seguro asumirlo.

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

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

4

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; aunque 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.

30

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

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

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

Some numbers for comparison can be found on Wikipedia. Para que pueda 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 ciertas 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 algo más grande.

Si genera mil millones de UUID por segundo, it would take about 36 years para obtener una probabilidad de colisión del 10%.

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

+0

Así es como el universo termina ... Algún programador simplemente asume que sus GUIDs siempre serán únicos para su mega Estrella de la Muerte ... – pkr298

Cuestiones relacionadas