Как генерируются GUID.NET 4?

Я знаю множество вопросов здесь, а также Раймонд отлично (как обычно) размещать. Однако, поскольку алгоритм создания GUID был изменен, по-видимому, мне было трудно получить самую последнюю информацию. MSDN, кажется, пытается предоставить как можно меньше информации.

Что известно о том, как GUID генерируются в .NET 4? Что было изменено и как оно влияет на безопасность ( "случайность" ) и целостность ( "уникальность" )?

Один из аспектов, которые меня интересуют: В версии 1 кажется невозможным сгенерировать один и тот же идентификатор GUID на одной машине снова, поскольку в нем задействована метка времени и счетчик. В v4 это уже не так (мне сказали), поэтому шанс получить один и тот же идентификатор GUID на одной машине... увеличен?

Ответы

Ответ 1

Так как Windows 2000 Microsoft использует алгоритм версии 4:

В Windows 2000 Microsoft перешла на GUID 4-й версии, поскольку вложение MAC-адреса рассматривалось как угроза безопасности. 1

Вы можете видеть это также из GUID, сгенерированного в .NET(из Wikipedia):

Версии 4 UUID имеют форму xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx с шестнадцатеричными цифрами для x, но только один из 8, 9, A или B для y. например f47ac10b-58cc-4372-a567-0e02b2c3d479.

Версия 4 UUID состоит из 122 значащих бит, что дает 2 ^ 122 различных значений, которые являются очень большим числом. Учитывая набор значений H, ожидаемое количество значений, которое мы должны выбрать, прежде чем находить первое случайное столкновение с вероятностью 50%, можно рассчитать следующим образом (см. День рождения Атака в Википедии):

alt text

Результат (день рождения) для 2 ^ 122 разных значений составляет приблизительно 2,89e + 18. Это предполагает, что порожденные значения распределяются случайным образом. Очевидно, что если значения распределены неравномерно, случайное столкновение можно найти быстрее. Для получения дополнительной информации см. Случайная вероятность дублирования UUID.

1 По сути, автор червя Melissa может отслеживать из-за генерируемого GUID используя алгоритм версии 1.

Ответ 2

Да, произошел сбой в .NET 4.0, Guid.NewGuid() напрямую вызывает CoCreateGuid(), небольшую оболочку вокруг UuidCreate (). Предыдущие версии .NET назывались вспомогательной функцией в CLR, GuidNative:: CompleteGuid(). Что вызывает CoCreateGuid. Не уверен, почему это изменение было сделано, пахнет не более чем небольшая оптимизация.

Во всяком случае, точно такая же функция Windows генерирует Guid, алгоритм был таким же в течение последних 10 лет, он такой же надежный, как и когда-либо.