En uno de los proyectos en los que estoy trabajando, el siguiente patrón se ve con bastante regularidad:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Si bien entiendo que no se garantiza que un GUID sea único y, según la documentación de MSDN, un GUID generado puede ser cero , es una consideración práctica que realmente vale la pena enviar pruebas de ciclos tanto en el sentido computacional como en términos de tiempo del desarrollador pensando en ello ?
Respuestas:
Sugeriría que no vale la pena buscar Guid.Empty. Los documentos de Guid.NewGuid por alguna razón mencionan que
Guid.NewGuid es un contenedor para Win32 API CoCreateGuid , que no menciona la devolución de todos los ceros.
Raymond Chen va más allá , sugiriendo que
Entonces, no, no me preocuparía por eso. No adivinaré por qué los documentos Guid.NewGuid incluso lo mencionan.
fuente
Si descubres
Guid.NewGuid() == Guid.Empty
que has ganado la lotería más dura del mundo. No te molestes con ninguna singularidad o comprobación de colisión. No tener que hacer eso es lo GUID son para . Te ahorraré las matemáticas, está en todas partes en la web.Además, las guías de Windows siempre tienen un "dígito" igual a
4
. Hay alguna estructura para los guías.El fragmento de código que publicó parece que un desarrollador olvidó inicializar una
Guid
variable y descubrió que eraGuid.Empty
. Se identificó erróneamenteGuid.NewGuid()
como la causa. Ahora él siempre creerá supersticiosamente en esto.En cualquier caso, esta es una pregunta incorrecta. Estoy seguro de que su código no solo depende de no dibujar nunca,
Guid.Empty
sino también de su singularidad. Esewhile
ciclo no impone la unicidad. Las guías están ahí para producir un valor único sin coordinación. Ese es su caso de uso.fuente
Mira el código fuente del
Guid.NewGuid
método :Ver el código del contrato? El
Guid.NewGuid
método nunca da un GUID vacío.fuente
Si va a verificar el GUID contra el GUID cero, por la misma lógica también debe hacer la debida diligencia para verificarlo contra todos los otros GUID en su aplicación (ya que la probabilidad de obtener un cero debe ser la misma que la probabilidad de obtener cualquier otro GUID en su aplicación *). Debe hacer esto para demostrar que el axioma en el que está actuando es que este GUID será único (que en realidad es el mismo axioma que las pruebas vs 0).
Obviamente, hacer esto es absurdo.
TLDR; Si puede confiar en NewGuid () para producir resultados únicos, también puede confiar en que no produzca ningún GUID conocido.
* En realidad, no es la misma probabilidad que los GUID de .NET siempre se ajustan a lo siguiente,
{________-____-4___-____-____________}
por lo que NewGuid NUNCA generará un GUID ceroSolo por diversión, sugerí una mejora en los documentos aquí: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
fuente