¿Es un GUID único el 100% del tiempo?
¿Se mantendrá único en múltiples hilos?
¿Es un GUID único el 100% del tiempo?
¿Se mantendrá único en múltiples hilos?
Respuestas:
Si bien 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 aproximadamente 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 podría obtener el mismo GUID en la situación correcta.
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
2^128
en escrito es aproximadamente: 34,028,236,692,093,846,346,337,460,743,177,000,000
. Estadísticamente, si calcularas 1000 GUID por segundo, todavía tomaría billones de años obtener un duplicado.
Si tiene miedo de los mismos valores GUID, coloque dos de ellos uno al lado del otro.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Si eres demasiado paranoico, pon tres.
999999999
en su forma, creo que Paranoia explotará mi navegador.
La respuesta simple es sí.
Raymond Chen escribió un excelente artículo sobre los GUID y por qué las subcadenas de los GUID no están garantizadas como únicas. El artículo profundiza en la forma en que se generan los GUID y los datos que utilizan para garantizar la unicidad, lo que debería extenderse un poco al explicar por qué son :-)
Como nota al margen, estaba jugando con 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". ¿Es una coincidencia o hay una explicación detrás de esto?
Ahora, cuando busqué en Google para la parte 4 en el GUID, encontré aproximadamente 125,000 visitas con GUID de volumen.
Conclusión: cuando se trata de GUID de volumen, no son tan únicos como otros GUID.
msiexec
, enumera todos los GUID de MSI del programa de Office. Todos deletrean 0FF1CE
. Parece que Microsoft tiene una interpretación bastante ... suelta ... de cómo generar un GUID;)
0FF1CE
GUID se incluyen en la sección "Compatibilidad con versiones anteriores de NCS" de RFC-4122, pero es poco probable que Microsoft siga las reglas de NCS para esos valores.
No debe suceder Sin embargo, cuando .NET está bajo una gran carga, es posible obtener guías duplicadas. Tengo dos servidores web diferentes que usan dos servidores sql diferentes. Fui a fusionar los datos y descubrí que tenía 15 millones de guías y 7 duplicados.
Guid.NewGuid
siempre genera v4 GUID (y siempre lo ha hecho). Tim debe haber tenido fuentes de entropía extremadamente pobres.
Sí, un GUID siempre debe ser único. Se basa tanto en hardware como en tiempo, además de algunos bits adicionales para garantizar 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 Guías:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Las guías son estadísticamente únicas. Las probabilidades de que dos clientes diferentes generen el mismo Guid son infinitamente pequeñas (suponiendo que no haya errores en el código de generación de Guid). También puede preocuparse por la falla de su procesador debido a un rayo cósmico y decidir que 2 + 2 = 5 hoy.
Los subprocesos múltiples que asignan nuevas guías obtendrán valores únicos, pero debe tener en cuenta que la función que está llamando 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 PC que tienen más o menos los mismos niveles de potencia informática, pero ignoremos esos). Asumamos que ponemos todas esas PC en el mundo a la tarea de generar GUID; si cada uno puede generar, digamos, 2 20 GUID por segundo, luego de solo unos 2 72 segundos, ciento cincuenta trillones de años , tendrá una probabilidad muy alta de generar una colisión con su GUID específico. Y las probabilidades de colisión se vuelven bastante buenas después de solo treinta billones de años.
Teóricamente, no, no son únicos. Es posible generar una guía idéntica una y otra vez. Sin embargo, las posibilidades de que ocurra son tan bajas que puede asumir que son únicas.
He leído antes que las posibilidades son tan bajas que realmente debería preocuparse por otra cosa, como que su servidor se queme espontáneamente u otros errores en su código. Es decir, suponga que es único y no construya ningún código para "atrapar" duplicados; dedique su tiempo a algo más probable que suceda (es decir, cualquier otra cosa ).
Me hice un intento para describir la utilidad de GUID a mi audiencia en el blog (memebers familia no técnicos). A partir de ahí (a través de Wikipedia), las probabilidades de generar un GUID duplicado:
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 las 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 más grande 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
Lo que resolvemos n
y obtenemos:
n = sqrt (2 * log 0.01 / log (1-1 / 2 128 ))
Qué 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.
De http://www.guidgenerator.com/online-guid-generator.aspx
¿Qué es un GUID?
GUID (o UUID) es el 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 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 humano en la Tierra generara 600,000,000 GUIDs, solo habría un 50% de probabilidad de 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 con la nube, y seguí recibiendo un error al sincronizar. Un vistazo a los registros reveló la línea impresionante:
"errores": [{"código": 1, "mensaje": "creator_guid: ya está tomado", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}
Estaba un poco incrédulo, pero seguramente, cuando encontré un camino en mi base de datos local de Neatworks y eliminé el registro que contenía ese GUID, el error dejó de ocurrir.
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 a que la práctica estándar no se respeta de alguna manera. (No tengo tanta suerte) Sin embargo, no puedo decir con certeza. No es mi software.
Su atención al cliente fue EXTREMADAMENTE cortés y servicial, pero nunca debieron haber encontrado este problema antes porque después de más de 3 horas por teléfono con ellos, no encontraron la solución. (FWIW, estoy muy impresionado con Neat, y esta falla, aunque frustrante, no cambió mi opinión sobre su producto).
MSDN :
Hay una probabilidad muy baja de que el valor del nuevo Guid sea cero o igual a cualquier otro Guid.
Si el reloj de su 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 estado reciclando los MAC (lo que se supone que no deben hacer) pero que se sabe que ocurre), y si la función de generación de GUID de su sistema se implementa correctamente, entonces su sistema nunca generará GUID duplicados.
Si todos en el mundo que están generando GUID siguen esas reglas, entonces sus GUID serán globalmente únicos.
En la práctica, el número de personas que rompen las reglas es bajo, y es poco probable que sus GUID "escapen". Los conflictos son estadísticamente improbables.
¿Es un GUID único el 100% del tiempo?
No garantizado, ya que hay varias formas de generar uno. Sin embargo, puede intentar calcular la posibilidad de crear dos GUID que sean idénticos y se le ocurre la idea: un GUID tiene 128 bits, por lo tanto, hay 2 128 GUID distintos, mucho más de lo que hay estrellas en el universo conocido. Lea el artículo de Wikipedia para más detalles.
En un sentido más general, esto se conoce como el "problema del cumpleaños" o la "paradoja del cumpleaños". Wikipedia tiene una muy buena visión general en: Wikipedia - Problema de cumpleaños
En términos muy generales, la raíz cuadrada del tamaño de la agrupación es una aproximación aproximada de cuándo se puede esperar una probabilidad del 50% de un duplicado. El artículo incluye una tabla de probabilidad 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%, esperaría elegir aleatoriamente 2.6 * 10 ^ 18 números 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 solo 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 / marcas de tiempo ya no se incorporan.
Para obtener un mejor resultado, la mejor manera es agregar el GUID con la marca de tiempo (solo para asegurarse de que permanezca único)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
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 únicos" , de Wikipedia (no sé por qué tanta gente ignora este bit): "... otras versiones GUID tienen diferentes propiedades y probabilidades de unicidad, que van desde la unicidad garantizada a probable no unicidad ".
Las propiedades pseudoaleatorias del JavaScript de V8 Math.random()
son TERRIBLES en su unicidad, con colisiones a menudo 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 PHP y Ruby de v4 GUID.
Debido a que se está volviendo cada vez más común escalar la generación de ID en múltiples clientes y grupos de servidores, la entropía tiene un gran éxito: las posibilidades de que se use la misma semilla aleatoria para generar una escalada de ID (el tiempo a menudo se usa como semilla aleatoria en generadores pseudoaleatorios), y las colisiones GUID aumentan de "probable no único" a "muy probable que causen muchos problemas".
Para resolver este problema, me propuse crear un algoritmo de identificación que pudiera escalar de manera segura y ofrecer mejores garantías contra la colisión. Lo hace mediante el uso de 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:
He experimentado que los GUID no son únicos durante las pruebas unitarias multiproceso / multiproceso (¿también?). Supongo que eso tiene que ver con que todas las otras cosas sean iguales, la siembra idéntica (o la falta de siembra) de generadores pseudoaleatorios. Lo estaba usando para generar nombres de archivo únicos. Descubrí que el sistema operativo es mucho mejor para hacerlo :)
Pregunta si los GUID son 100% únicos. Eso depende de la cantidad de GUID entre los que debe ser único. A medida que el número de GUID se aproxima al infinito, la probabilidad de duplicar GUID se aproxima al 100%.
La respuesta de "¿Es un GUID es 100% único?" es simplemente "No" .
Si desea 100% de unicidad de GUID, haga lo siguiente.
La parte más difícil no se trata de generar un Guid duplicado.
La parte más difícil es diseñar una base de datos para almacenar todos los generados para verificar si realmente está duplicada.
De WIKI:
Por ejemplo, el número de UUID de versión 4 aleatorios que deben generarse para tener una probabilidad del 50% de al menos una colisión es 2.71 quintillones, calculados de la siguiente manera:
ingrese la descripción de la imagen aquí
Este número es equivalente a generar mil millones de UUID por segundo durante aproximadamente 85 años, y un archivo que contenga tantos UUID, a 16 bytes por UUID, sería de aproximadamente 45 exabytes, muchas veces más grandes que las bases de datos más grandes que existen actualmente. el orden de cientos de petabytes
GUID significa Global Unique Identifier
En resumen: (la pista está en el nombre)
En detalle: los GUID están diseñados para ser únicos; se calculan utilizando un método aleatorio basado en el reloj de la computadora y la computadora misma, si está creando muchos GUID en el mismo milisegundo en la misma máquina, es posible que coincidan, pero para casi todas las operaciones normales deberían considerarse únicos.