¿Cómo se generan .NET 4 GUIDs?

Soy consciente de la multitud de preguntas aquí , así como de la excelente (como habitual) publicación de Raymond. Sin embargo, dado que aparentemente el algoritmo para crear GUID cambió, me resultó difícil tener acceso a información actualizada. El MSDN parece tratar de proporcionar la menor cantidad de información posible.

¿Qué se sabe acerca de cómo se generan los GUID en .NET 4? ¿Qué cambió y cómo afecta la seguridad (“aleatoriedad”) y la integridad (“unicidad”)?

Un aspecto específico que me interesa: en la v1, parece ser casi imposible generar el mismo GUID en una sola máquina porque había una marca de tiempo y un contador involucrados. En v4, este ya no es el caso (me dijeron), por lo que aumentó la posibilidad de obtener el mismo GUID en una sola máquina …

Desde Windows 2000, Microsoft usa un algoritmo de la versión 4:

Con Windows 2000, Microsoft cambió a los GUID de la versión 4, ya que la incrustación de la dirección MAC se consideraba un riesgo de seguridad. 1

Puedes ver eso también desde un GUID generado en .NET (de Wikipedia ):

Los UUID de versión 4 tienen el formato xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx con dígitos hexadecimales para x pero solo uno de 8, 9, A o B para yendo f47ac10b-58cc-4372-a567-0e02b2c3d479.

Un UUID de versión 4 consta de 122 bits significativos, dando 2 ^ 122 valores distintos, que es un número muy grande. Dado un conjunto de valores H , el número esperado de valores que tenemos que elegir antes de encontrar la primera colisión aleatoria con un 50% de probabilidad se puede calcular de la siguiente manera (vea Ataque de cumpleaños en Wikipedia):

texto alternativo

El resultado (límite de cumpleaños) para 2 ^ 122 valores diferentes es aproximadamente 2,89e + 18. Esto supone que los valores generados se distribuyen aleatoriamente. Obviamente, si los valores se distribuyen de manera desigual, una colisión aleatoria se puede encontrar más rápido. Para obtener más detalles, consulte también la probabilidad de duplicados de UUID aleatorio .

1 De hecho, el autor del gusano Melissa podría rastrearse debido a un GUID generado utilizando un algoritmo de versión 1.

Sí, hubo un cambio en .NET 4.0, Guid.NewGuid () llama directamente a CoCreateGuid () , un pequeño contenedor alrededor de UuidCreate (). Las versiones anteriores de .NET llamaron a una función auxiliar en el CLR, GuidNative :: CompleteGuid (). Que llama a CoCreateGuid. No estoy seguro de por qué se realizó este cambio, huele a nada más que una optimización menor.

En cualquier caso, la misma función de Windows genera el Guid, el algoritmo ha sido el mismo en los últimos 10 años, es tan confiable como siempre lo fue.