Em um dos projetos em que estou trabalhando, o seguinte padrão é visto regularmente:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Embora eu entenda que um GUID não é garantido como único e, de acordo com a documentação do MSDN, um GUID gerado pode ser zero , essa é uma consideração prática que realmente vale a pena enviar testes de ciclo para ambos no sentido computacional e em termos de tempo do desenvolvedor pensando nisso ?
Respostas:
Eu sugeriria que não vale a pena procurar por Guid.Empty. Os documentos de Guid.NewGuid, por algum motivo, mencionam que
Guid.NewGuid é um wrapper para a API Win32 CoCreateGuid , que não faz menção ao retorno de todos os zeros.
Raymond Chen vai mais longe , sugerindo que
Então, não, eu não me preocuparia com isso. Não vou adivinhar por que os documentos do Guid.NewGuid sequer o mencionam.
fonte
Se você acha
Guid.NewGuid() == Guid.Empty
que ganhou a loteria mais difícil do mundo. Não se preocupe com nenhuma verificação de singularidade ou colisão. Não ter que fazer isso é o que guids são para . Vou poupar-lhe a matemática, está em toda parte na web.Além disso, os guias do Windows sempre têm um "dígito" igual a
4
. Existe alguma estrutura para os guias.Esse snippet de código que você postou parece que um desenvolvedor esqueceu de inicializar uma
Guid
variável e achou que eraGuid.Empty
. Ele erroneamente identificadoGuid.NewGuid()
como a causa. Agora ele sempre acreditará supersticiosamente nisso.De qualquer forma, esta é a pergunta errada a ser feita. Tenho certeza de que seu código não depende apenas do desenho,
Guid.Empty
mas também da exclusividade. Essewhile
loop não impõe exclusividade. Os guias estão aí para produzir um valor único sem coordenação. Esse é o caso de uso deles.fonte
Veja o código fonte do
Guid.NewGuid
método :Veja o código do contrato? O
Guid.NewGuid
método nunca fornece um GUID vazio.fonte
Se você estiver indo para verificar o GUID contra o GUID zero, pela mesma lógica também precisará fazer a devida diligência para compará-lo com todos os outros GUIDs em seu aplicativo (como a probabilidade de obter um zero deve ser a mesma que a probabilidade de obtendo qualquer outro GUID no seu aplicativo *). Você precisa fazer isso para provar que o axioma no qual você está agindo é que esse GUID será único (que na verdade é o mesmo axioma do teste vs 0).
Obviamente, fazer isso é um absurdo.
TLDR; Se você pode confiar em NewGuid () para produzir resultados exclusivos, também pode confiar em não produzir nenhum GUID conhecido único.
* Na verdade, não é a mesma probabilidade que os GUIDs .NET sempre se ajustam ao seguinte,
{________-____-4___-____-____________}
portanto o NewGuid NUNCA gerará um guia zeroApenas por diversão, sugeri uma melhoria nos documentos aqui: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
fonte