¿Es un GUID único el 100% del tiempo?

¿Es un GUID único el 100% del tiempo?

¿Será único en múltiples hilos?

Aunque no se garantiza que cada GUID generado sea único, el número total de claves únicas (2 ^ 128 o 3.4 × 10 ^ 38) es tan grande que la probabilidad de que se genere el mismo número dos veces es muy pequeña. Por ejemplo, considere el universo observable, que contiene alrededor de 5 × 10 ^ 22 estrellas; cada estrella podría tener 6.8 × 10 ^ 15 GUID universalmente únicos.

De Wikipedia .


Estos son algunos buenos artículos sobre cómo se hace un GUID (para .NET) y cómo se puede obtener el mismo GUID en la situación correcta.

http://ericlippert.com/2012/04/24/guid-guide-part-one/

http://ericlippert.com/2012/04/30/guid-guide-part-two/

http://ericlippert.com/2012/05/07/guid-guide-part-three/

La respuesta simple es sí.

Raymond Chen escribió un excelente artículo sobre GUID y por qué las subcadenas de GUID no están garantizadas como únicas. El artículo profundiza en la forma en que se generan los GUID y en los datos que utilizan para garantizar la exclusividad, lo que debería explicar con detalle por qué son 🙂

Si tiene miedo de los mismos valores de GUID, coloque dos al lado del otro.

 Guid.NewGuid().ToString() + Guid.NewGuid().ToString(); 

Si eres demasiado paranoico, pon tres.

Como nota al margen, estaba jugando con los GUID de volumen en Windows XP. Este es un diseño de partición muy oscuro con tres discos y catorce volúmenes.

 \\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:) \\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:) \\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:) \\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:) \\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:) \\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:) \\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:) \\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:) \\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:) \\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:) \\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:) \\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:) \\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:) | | | | | | | | | +-- 6f = o | | | +---- 69 = i | | +------ 72 = r | +-------- 61 = a +---------- 6d = m 

No es que los GUID sean muy similares, sino el hecho de que todos los GUID tienen la cadena “mario” en ellos. ¿Es eso una coincidencia o hay una explicación detrás de esto?

Ahora, cuando busco la parte 4 en el GUID, encontré aproximadamente 125,000 visitas con GUID de volumen.

Conclusión: cuando se trata de los GUID de volumen, no son tan únicos como otros GUID.

Sí, un GUID siempre debe ser único. Se basa tanto en hardware como en tiempo, más algunos bits adicionales para asegurarse de que sea único. Estoy seguro de que es teóricamente posible terminar con dos idénticos, pero extremadamente improbable en un escenario del mundo real.

Aquí hay un gran artículo de Raymond Chen sobre Guids:

http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

No debería suceder. Sin embargo, cuando .NET tiene una gran carga, es posible obtener guiones duplicados. Tengo dos servidores web diferentes que usan dos servidores sql diferentes. Fui a fusionar los datos y encontré que tenía 15 millones de guids y 7 duplicados.

Las guías son estadísticamente únicas. Las probabilidades de que dos clientes diferentes generen el mismo Guid son infinitesimalmente pequeñas (suponiendo que no haya errores en el código generador de Guid). También puede preocuparse por el glitching de su procesador debido a un rayo cósmico y decidir que 2 + 2 = 5 hoy.

Los subprocesos múltiples que asignan guias nuevas obtendrán valores únicos, pero debe tener en cuenta que la función a la que llama es segura para subprocesos. ¿En qué ambiente está esto?

Eric Lippert ha escrito una serie muy interesante de artículos sobre GUID.

Hay en el orden 2 30 computadoras personales en el mundo (y, por supuesto, muchos dispositivos de mano o dispositivos informáticos que no son para PC que tienen más o menos los mismos niveles de potencia de cálculo, pero vamos a ignorarlos). Supongamos que ponemos todas esas PC en el mundo a la tarea de generar GUIDs; si cada uno puede generar, digamos, 2 20 GUID por segundo, luego de solo unos 72 segundos, ciento cincuenta billones de años , tendrá muchas posibilidades de generar una colisión con su GUID específico. Y las probabilidades de colisión son bastante buenas después de solo treinta billones de años.

  • Guía GUID, primera parte
  • Guía GUID, segunda parte
  • Guía GUID, tercera parte

Teóricamente, no, no son únicos. Es posible generar una guía idéntica una y otra vez. Sin embargo, las posibilidades de que suceda son tan bajas que puede suponer que son únicas.

He leído antes que las posibilidades son tan bajas que realmente debería preocuparse por algo más, como que su servidor queme espontáneamente u otros errores en su código. Es decir, suponga que es único y no incorpore ningún código para “atrapar” duplicados: dedique su tiempo a algo más probable que ocurra (es decir, cualquier otra cosa ).

Intenté describir la utilidad de los GUID para la audiencia de mi blog (miembros de la familia no técnicos). A partir de ahí (a través de Wikipedia), las probabilidades de generar un GUID duplicado:

  • 1 en 2 ^ 128
  • 1 en 340 undecillones (no se preocupe, undecillion no está en el cuestionario)
  • 1 en 3.4 × 10 ^ 38
  • 1 en 340,000,000,000,000,000,000,000,000,000,000,000,000

Desde http://www.guidgenerator.com/online-guid-generator.aspx

¿Qué es un GUID?

GUID (o UUID) es un acrónimo de ‘Globally Unique Identifier’ (o ‘Universally Unique Identifier’). Es un número entero de 128 bits utilizado para identificar recursos. El término GUID generalmente lo usan los desarrolladores que trabajan con tecnologías de Microsoft, mientras que el UUID se usa en cualquier otro lugar.

¿Qué tan único es un GUID?

128 bits es lo suficientemente grande y el algoritmo de generación es lo suficientemente único como para que si se generaran 1,000,000,000 de GUID por segundo durante 1 año, la probabilidad de un duplicado sería solo del 50%. O si cada ser humano en la Tierra generara 600,000,000 de GUID, solo habría un 50% de probabilidad de duplicar.

Ninguno parece mencionar la matemática real de la probabilidad de que ocurra.

Primero, supongamos que podemos usar todo el espacio de 128 bits (Guid v4 solo usa 122 bits).

Sabemos que la probabilidad general de NO obtener un duplicado en n selecciones es:

(1-1 / 2 128 ) (1-2 / 2 128 ) … (1- (n-1) / 2 128 )

Como 2 128 es mucho más grande que n , podemos aproximar esto a:

(1-1 / 2 128 ) n (n-1) / 2

Y como podemos suponer que n es mucho mayor que 0, podemos aproximarlo a:

(1-1 / 2 128 ) n ^ 2/2

Ahora podemos equiparar esto a la probabilidad “aceptable”, digamos 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0.01

Que resolvemos por n obtenemos:

n = sqrt (2 * log 0.01 / log (1-1 / 2 128 ))

Que Wolfram Alpha llega a ser 5.598318 × 10 19

Para poner ese número en perspectiva, tomemos 10000 máquinas, cada una con una CPU de 4 núcleos, haciendo 4Ghz y gastando 10000 ciclos para generar un Guid y no hacer nada más. Luego tomaría ~ 111 años antes de que generen un duplicado.

Experimenté un GUID duplicado.

Uso el escáner de escritorio Neat Receipts y viene con un software de base de datos patentado. El software tiene una función de sincronización a la nube, y recibí un error al sincronizar. Un vistazo a los registros reveló la increíble línea:

“errors”: [{“code”: 1, “message”: “creator_guid: is already taken”, “guid”: “C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}

Estaba un poco incrédulo, pero seguramente, cuando encontré una forma en mi base de datos local de tareas y borré el registro que contenía ese GUID, el error se detuvo.

Entonces, para responder a su pregunta con evidencia anecdótica, no. Un duplicado es posible. Pero es probable que la razón por la que sucedió no se deba al azar, sino debido a que no se cumple la práctica estándar de alguna manera. (No soy tan afortunado) Sin embargo, no puedo decirlo con certeza. No es mi software.

Su atención al cliente fue MUY cortés y servicial, pero nunca debieron haber encontrado este problema porque después de más de 3 horas hablando por teléfono con ellos, no encontraron la solución. (FWIW, estoy muy impresionado con Neat, y este problema, por frustrante que sea, no modificó mi opinión sobre su producto).

Si el reloj del sistema está configurado correctamente y no se ha ajustado, y si su NIC tiene su propio MAC (es decir, no ha configurado un MAC personalizado) y su proveedor de NIC no ha reciclado los MAC (lo que no se supone que deben hacer) pero que se sabe que ocurre), y si la función de generación GUID del sistema se implementa correctamente, su sistema nunca generará GUID duplicados.

Si todos los que están generando GUID en la tierra siguen esas reglas, entonces sus GUID serán únicos en el mundo.

En la práctica, el número de personas que infringe las reglas es bajo y es poco probable que sus GUID “escapen”. Los conflictos son estadísticamente improbables.

MSDN :

Hay una probabilidad muy baja de que el valor del nuevo Guid sea cero o igual a cualquier otro Guid.

¿Es un GUID único el 100% del tiempo?

No se garantiza, ya que hay varias maneras de generar uno. Sin embargo, puede intentar calcular la posibilidad de crear dos GUID que sean idénticos y obtendrá la idea: un GUID tiene 128 bits, por lo tanto, hay 2 128 GUID distintos, mucho más que estrellas en el universo conocido. Lea el artículo de Wikipedia para más detalles.

He experimentado que los GUID no son únicos durante las pruebas unitarias de múltiples subprocesos / procesos múltiples (¿también?). Supongo que eso tiene que ver con, siendo todos los demás tonos iguales, la siembra idéntica (o la falta de siembra) de generadores pseudo aleatorios. Lo estaba usando para generar nombres de archivo únicos. Encontré que el sistema operativo es mucho mejor para hacer eso 🙂

Alerta de arrastre

Usted pregunta si los GUID son 100% únicos. Eso depende de la cantidad de GUID que debe ser único. A medida que el número de GUID se acerca al infinito, la probabilidad de que los GUID duplicados se acerquen al 100%.

Los algoritmos GUID generalmente se implementan de acuerdo con la especificación GUID v4, que es esencialmente una cadena pseudoaleatoria. Lamentablemente, estos entran en la categoría de “probablemente no único” , de Wikipedia (no sé por qué tanta gente ignora este bit): “… otras versiones de GUID tienen diferentes propiedades y probabilidades de exclusividad, que van desde la unicidad garantizada a la posible no unicidad “.

Las propiedades pseudoaleatorias de JavaScript Math.random() de V8 son TERRIBLE en la unicidad, con colisiones que a menudo vienen después de solo unos pocos miles de iteraciones, pero V8 no es el único culpable. He visto colisiones de GUID en el mundo real usando implementaciones de PHP y de Ruby de GUID v4.

Debido a que cada vez es más común escalar la generación de ID entre múltiples clientes y clusters de servidores, la entropía tiene un gran impacto: las posibilidades de que se use la misma semilla aleatoria para generar una escalada de ID (el tiempo se usa a menudo como una semilla aleatoria en generadores pseudoaleatorios), y las colisiones GUID escalan de “probable no exclusivo” a “muy probable que cause muchos problemas”.

Para resolver este problema, me propuse crear un algoritmo de ID que pudiera escalar de forma segura y ofrecer mejores garantías contra la colisión. Lo hace al usar la marca de tiempo, un contador de cliente en memoria, huella digital del cliente y caracteres aleatorios. La combinación de factores crea una complejidad aditiva que es particularmente resistente a la colisión, incluso si la escala en varios hosts:

http://usecuid.org/

En un sentido más general, esto se conoce como el “problema del cumpleaños” o “paradoja del cumpleaños”. Wikipedia tiene una visión general muy buena en: Wikipedia – Problema de cumpleaños

En términos muy generales, la raíz cuadrada del tamaño del grupo es una aproximación aproximada de cuándo puede esperar un 50% de probabilidad de un duplicado. El artículo incluye una tabla de probabilidades del tamaño del grupo y varias probabilidades, incluida una fila para 2 ^ 128. Por lo tanto, para una probabilidad de colisión del 1%, se esperaría elegir al azar números de 2.6 * 10 ^ 18 de 128 bits. Una probabilidad del 50% requiere 2.2 * 10 ^ 19 selecciones, mientras que SQRT (2 ^ 128) es 1.8 * 10 ^ 19.

Por supuesto, ese es el caso ideal de un proceso verdaderamente aleatorio. Como otros mencionaron, mucho se basa en ese aspecto aleatorio : ¿qué tan bueno es el generador y la semilla? Sería bueno si hubiera algún soporte de hardware para ayudar con este proceso, que sería más a prueba de balas, excepto que cualquier cosa puede ser falsificada o virtualizada. Sospecho que esa podría ser la razón por la cual las direcciones MAC / sellos de tiempo ya no se incorporan.

La respuesta de “¿Es un GUID 100% único?” es simplemente “No” .

  • Si desea un 100% de exclusividad de GUID, haga lo siguiente.

    1. generar GUID
    2. compruebe si ese GUID existe en su columna de la tabla en la que está buscando exclusividad
    3. si existe, vaya al paso 1 más paso 4
    4. use este GUID como único.