Как являются.NET 4 сгенерированные GUID?

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

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

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

43
задан Community 23 May 2017 в 12:09
поделиться

2 ответа

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

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

Это также можно увидеть из GUID, созданного в .NET (из Википедии ):

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%, можно рассчитать следующим образом (см. Birthday Attack в Википедии). ):

alt text

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

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

52
ответ дан 26 November 2019 в 22:57
поделиться

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

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

18
ответ дан 26 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: