Как создаются .NET 4 GUID? - PullRequest
43 голосов
/ 03 мая 2010

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

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

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

Ответы [ 2 ]

52 голосов
/ 03 мая 2010

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

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

Это также видно из GUID, сгенерированного в .NET (из Wikipedia ):

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

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

alt text

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

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

18 голосов
/ 03 мая 2010

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

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

...