В одном из проектов, над которым я работаю, следующая картина видится довольно регулярно:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Хотя я понимаю, что GUID не гарантированно является уникальным, и в соответствии с документацией MSDN сгенерированный GUID может быть равен нулю , это практическое соображение на самом деле стоит посылать циклическое тестирование как в вычислительном смысле, так и с точки зрения времени разработчика, думая об этом ?
Ответы:
Я бы предположил, что не стоит проверять Guid.Empty. Документы для Guid.NewGuid почему-то упоминают, что
Guid.NewGuid - это оболочка для Win32 API CoCreateGuid , которая не упоминает о возврате всех нулей.
Раймонд Чен идет дальше , предполагая, что
Так что нет, я бы не волновался об этом. Я не буду догадываться, почему документы Guid.NewGuid даже упоминают об этом.
источник
Если вы обнаружите
Guid.NewGuid() == Guid.Empty
, что выиграли самую сложную лотерею на земле. Не беспокойтесь ни о какой уникальности или проверке столкновений. Не имея делать это то , что идентификаторы GUID являются для . Я избавлю вас от математики, это везде в сети.Кроме того, направляющие Windows всегда имеют одну «цифру», равную
4
. Существует некоторая структура для гидов.Этот фрагмент кода, который вы разместили, выглядит так, как будто один разработчик забыл инициализировать
Guid
переменную и обнаружил, что это такGuid.Empty
. Он ошибочно определенGuid.NewGuid()
как причина. Теперь он навсегда суеверно поверит в это.В любом случае это неправильный вопрос. Я уверен, что ваш код зависит не только от рисования,
Guid.Empty
но и от уникальности. Этотwhile
цикл не обеспечивает уникальность. Гиды должны создать уникальную ценность без координации. Это их вариант использования.источник
Посмотрите на исходный код
Guid.NewGuid
метода :Видите код договора?
Guid.NewGuid
Метод никогда не дает пустой GUID.источник
Если вы собираетесь проверять GUID по нулевому GUID, вам по той же логике также необходимо провести тщательную проверку его по всем остальным GUID в вашем приложении (поскольку вероятность получения нуля должна совпадать с вероятностью получить любой другой GUID в вашем приложении *). Вы должны сделать это, чтобы доказать, что аксиома, под которой вы действуете, состоит в том, что этот GUID будет уникальным (что на самом деле та же самая аксиома, что и при тестировании против 0).
Очевидно, что делать это абсурдно.
TLDR; Если вы можете доверять NewGuid () для получения уникальных результатов, вы также можете доверять ему, чтобы он не создавал ни одного известного GUID.
* На самом деле это не та вероятность, что .NET GUID всегда соответствуют следующему,
{________-____-4___-____-____________}
поэтому NewGuid НИКОГДА не сгенерирует нулевую направляющую.Просто для забавы я предложил улучшить документы здесь: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
источник