Могут ли два потока одного и того же процесса создавать один и тот же GUID? - PullRequest
19 голосов
/ 13 мая 2010

Если два потока в процессе генерируют новый GUID одновременно с использованием .NET API (Guid.NewGuid()), возможно ли, что два GUID будут идентичны?

Спасибо.

UPDATE Я хочу стать практичным. Я знаю, что широко распространено мнение, что GUID уникальны для всех практических целей. Мне интересно, могу ли я одинаково относиться к ГУИДам, созданным разными потоками одного и того же процесса.

Ответы [ 4 ]

30 голосов
/ 13 мая 2010

Короткий ответ

Возможно (например, могло ли это когда-либо случиться при жизни вселенной)? Да.

Вероятно (при все )? Нет.


Более длинный ответ

Microsoft использует алгоритм версии 4 для генерации идентификаторов GUID (см. Также: здесь ), который генерирует полностью (псевдо-) случайное число.

Учитывая количество возможных GUID, вероятность дубликата ничтожна. Мол, непостижимо крошечный.

Вас беспокоит параллелизм: к счастью, метод NewGuid является поточно-безопасным , что означает, что он либо блокирует, либо использует для своих целей генератор статических потоков со случайными числами. Первый подход будет эффективно сериализовать все вызовы NewGuid так, чтобы они происходили последовательно (никогда не одновременно), в то время как последний будет делать вызовы из отдельных потоков независимыми друг от друга.

В любом случае единственная причина, по которой вам следует опасаться получения дубликатов из двух потоков, одновременно создающих случайные числа - GUID или нет, - это если основные генераторы, используемые потоками, работали (1) из то же самое начальное число (которое могло возникнуть только из-за недостатка проекта), и (2) в зависимости от времени (чего нет в алгоритме GUID версии 4).

Так что да, практически, вы можете рассматривать GUID, сгенерированные одновременно из отдельных потоков, как уникальные.

8 голосов
/ 13 мая 2010

Не возможно. Статические методы Guid гарантированно являются поточно-ориентированными. Смотри документацию здесь .

1 голос
/ 13 мая 2010

Ну, текущие реализации .Net используют CoCreateGuid внутренне:

С очень высокой степенью достоверности эта функция возвращает уникальное значение - никакие другие вызовы в той же или любой другой системе (сетевой или нет) не должны возвращать такое же значение.

1 голос
/ 13 мая 2010

Это вряд ли произойдет ...

http://msdn.microsoft.com/en-gb/library/system.guid(v=VS.95).aspx

Любые открытые статические (Shared в Visual Basic) члены этого типа являются потокобезопасными. Ни один из членов экземпляра не гарантированно является потокобезопасным. [...]

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

...