Является ли GUID уникальным в 100% случаев? - PullRequest
451 голосов
/ 02 сентября 2008

Является ли GUID уникальным в 100% случаев?

Будет ли он уникальным для нескольких потоков?

Ответы [ 21 ]

382 голосов
/ 02 сентября 2008

Хотя каждый сгенерированный GUID не гарантированно будет уникальным, общее количество уникальных ключей (2 128 или 3,4 × 10 38 ) настолько велика, что вероятность того же числа составляет генерируется дважды, очень мало. За Например, рассмотрим наблюдаемое Вселенная, которая содержит около 5 × 10 22 * ​​1007 * звезды; каждая звезда может иметь 6,8 × 10 15 универсально уникальные GUID.

Из Википедия .


Это несколько хороших статей о том, как создается GUID (для .NET) и как вы можете получить такое же руководство в правильной ситуации.

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

1029 *

60 голосов
/ 02 сентября 2008

Простой ответ - да.

Рэймонд Чен написал замечательную статью о GUID и почему подстроки GUID не гарантированно уникальны. В этой статье подробно рассматривается способ создания идентификаторов GUID и данные, которые они используют для обеспечения уникальности, что должно быть довольно подробно объяснено почему они: -)

55 голосов
/ 09 мая 2014

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

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

Если вы слишком параноик, тогда поставьте три.

34 голосов
/ 14 января 2010

Как примечание, я играл с томами GUID в Windows XP. Это очень непонятная структура разделов с тремя дисками и четырнадцатью томами.

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

Дело не в том, что GUID очень похожи, а в том, что во всех GUID есть строка "mario". Это совпадение или есть объяснение этому?

Теперь, когда погуглил по части 4 в GUID, я обнаружил около 125 000 попаданий с объемными GUID.

Вывод: Когда речь идет о томах GUID тома, они не так уникальны, как другие GUID.

26 голосов
/ 02 сентября 2008

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

Вот отличная статья Раймонда Чена о гидах:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

22 голосов
/ 30 января 2010

Этого не должно быть. Однако, когда .NET находится под большой нагрузкой, возможно получить дубликаты руководств. У меня есть два разных веб-сервера, использующие два разных сервера SQL. Я пошел объединить данные и обнаружил, что у меня 15 миллионов направляющих и 7 дубликатов.

20 голосов
/ 02 сентября 2008

Направляющие статистически уникальны. Шансы двух разных клиентов, генерирующих один и тот же Guid, бесконечно малы (при условии отсутствия ошибок в коде, генерирующем Guid). Вы можете также беспокоиться о сбое вашего процессора из-за космического луча и решения, что сегодня 2 + 2 = 5.

Несколько потоков, выделяющих новые направляющие, получат уникальные значения, но вы должны понимать, что вызываемая вами функция является поточно-ориентированной. В какой среде это?

16 голосов
/ 08 июня 2012

Эрик Липперт написал очень интересную серию статей о GUID.

В мире есть порядка 2 30 персональных компьютеров (и Конечно, много портативных устройств или не компьютерных вычислительных устройств, которые имеют более или менее одинаковые уровни вычислительной мощности, но давайте игнорировать те). Давайте предположим, что мы поставили все эти компьютеры в мире на задача генерации GUID; если каждый из них может генерировать, скажем, 2 20 GUID в секунда, а затем примерно через 2 72 секунд - сто пятьдесят триллион лет - у вас будет очень высокий шанс получить столкновение с вашим конкретным GUID. И шансы столкновения получить довольно хорошо после всего лишь тридцати триллионов лет.

14 голосов
/ 02 сентября 2008

Теоретически нет, они не уникальны. Можно генерировать идентичный гид снова и снова. Однако вероятность того, что это произойдет, настолько мала, что можно предположить, что они уникальны.

Я уже читал ранее, что шансы настолько малы, что вам действительно нужно беспокоиться о чем-то другом - например, о том, что ваш сервер самопроизвольно сгорает или другие ошибки в вашем коде. То есть, предположите, что он уникален, и не создавайте никакого кода, чтобы «ловить» дубликаты - тратьте свое время на что-то более вероятное (т.е.

Я предпринял попытку описать полезность GUID для аудитории моего блога (нетехнических членов семьи). Оттуда (через Википедию) вероятность создания дубликата GUID:

  • 1 в 2 ^ 128
  • 1 из 340 ундециллионов (не волнуйтесь, ундециллион не викторины)
  • 1 в 3,4 × 10 ^ 38
  • 1 из 340 000 000 000 000 000 000 000 000 000 000 000 000
9 голосов
/ 03 января 2017

Никто, кажется, не упоминает фактическую математику вероятности его возникновения.

Во-первых, давайте предположим, что мы можем использовать все 128-битное пространство (Guid v4 использует только 122-битные).

Мы знаем, что общая вероятность НЕ получить дубликат в n пиках:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (п-1) / 2 128 )

Поскольку 2 128 намного больше, чем n, мы можем приблизить это к:

(1-1 / 2 128 ) п (п-1) / 2 * 1 027 ** 1 028 *

И поскольку мы можем предположить, что n намного больше 0, мы можем приблизить это к:

* * 1034 (1-1 / 2 128 ) п ^ 2/2

Теперь мы можем приравнять это к «приемлемой» вероятности, скажем, 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0,01

Что мы решаем за n и получаем:

n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))

Какой Вольфрам Альфа становится 5.598318 × 10 19

Чтобы представить это число в перспективе, давайте возьмем 10000 машин, каждая из которых имеет 4-ядерный ЦП, работает на частоте 4 ГГц и тратит 10000 циклов на генерацию Guid и больше ничего не делает. Затем потребуется около 111 лет, прежде чем они создадут дубликат.

...