Может ли два потока одного и того же процесса получить один и тот же идентификатор GUID?

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

Спасибо.

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

Ответы

Ответ 1

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

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

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


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

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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