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

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

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

19 ответов


пока каждый сгенерированный GUID не гарантировано быть уникальным, итогом количество уникальных ключей (2^128 или 3.4×10^38) настолько велика, что вероятность того же числа генерируется дважды очень мало. Для пример, рассмотрим наблюдаемый Вселенной, который содержит около 5×10^22 звезды; тогда каждая звезда могла бы 6.8×10^15 универсально уникальные GUID.

С Википедия.


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

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

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

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


простой ответ: да.

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


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

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

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


в качестве примечания, я играл с 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" в них. Это совпадение или этому есть объяснение?

теперь, когда googling для части 4 в GUID я нашел около 125.000 хитов с объемом идентификатор GUID.

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


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

вот отличная статья Раймонда Чена о Guids:

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


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


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

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


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

есть по порядку 230 персональные компьютеры в мире (и курс много ручных устройств или не-PC вычислительных устройств, которые имеют более или менее одинаковые уровни вычислительной мощности, но позволяет игнорировать те.) Давайте предположим, что мы помещаем все эти ПК в мире в задача генерации GUID; если каждый из них может генерировать, скажем, 220 GUIDs в во-вторых, после только около 272 секунд...сто пятьдесят триллион лет!--11--> -- у вас будет очень высокий вероятность возникновения столкновение с указанным идентификатором GUID. И шансы столкновения получить довольно неплохо после тридцати триллионов лет.


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

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

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

  • 1 в 2^128
  • 1 в 340 undecillion (не волнуйтесь, undecillion не находится на викторина)
  • 1 в 3.4 × 10^38
  • 1 в 340,000,000,000,000,000,000,000,000,000,000,000,000

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

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

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

(1-1/2128)(1-2/2128)...(1-(n-1)/2128)

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

(1-1/2128)n (n-1)/2

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

(1-1/2128)n^2/2

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

(1-1/2128)n^2/2 = 0.01

который мы решаем для n и

n = sqrt (2 * log 0.01 / log (1-1 / 2128))

каким Вольфрам Альфа становится 5.598318 × 1019

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


от http://www.guidgenerator.com/online-guid-generator.aspx

что такое GUID?

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

насколько уникален Идентификатор GUID?

128-бит достаточно большой, и алгоритм генерации достаточно уникален, что если бы 1,000,000,000 GUID в секунду были сгенерированы в течение 1 года, вероятность дублирования была бы только 50%. Или, если бы каждый человек на Земле генерировал 600 000 000 GUID, вероятность дублирования была бы только 50%.


Я испытал дубликат GUID.

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

"ошибки": [{"код": 1, "сообщение": "creator_guid: уже принято", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

Я был немного в недоумении, но, конечно, когда Я нашел способ в моей локальной базе данных neatworks и удалил запись, содержащую этот идентификатор GUID, ошибка прекратилась.

чтобы ответить на ваш вопрос с некоторым свидетельствам, нет. Дубликат возможен. Но вполне вероятно, что это произошло не случайно, а из-за того, что стандартная практика каким-то образом не соблюдалась. (Мне просто не повезло) однако, я не могу сказать наверняка. Это не моя программа.

их поддержка клиентов была чрезвычайно вежливой и полезно, но они, должно быть, никогда не сталкивались с этой проблемой раньше, потому что после 3+ часов по телефону с ними они не нашли решения. (FWIW, я очень впечатлен Neat, и этот глюк, несмотря на разочарование, не изменил моего мнения об их продукте.)


Если ваши системные часы установлены правильно и не обернуты, и если ваш NIC имеет свой собственный MAC (т. е. вы не установили пользовательский MAC), и ваш поставщик NIC не перерабатывает Mac (что они не должны делать, но что, как известно, происходит), и если функция генерации GUID вашей системы правильно реализована, то ваша система никогда не будет генерировать дубликаты GUID.

Если все на земле, кто генерирует GUIDs следует этим правилам, то ваши GUIDs будут глобально уникальный.

на практике количество людей, которые нарушают правила, невелико, и их GUID вряд ли "убежат". Конфликты статистически маловероятны.


MSDN:

существует очень низкая вероятность того, что значение нового Guid будет все нули или равно любому другому Guid.


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

не гарантируется, так как существует несколько способов генерации одного. Однако вы можете попытаться вычислить вероятность создания двух идентичных GUID, и вы получите идею: GUID имеет 128 бит, следовательно, есть 2128 различные GUIDs -много больше, чем звезд в известной нам Вселенной. Прочтите статья в Википедии для получения более подробной информации.


Я испытал, что GUIDs не уникальны во время многопоточного/многопроцессорного модульного тестирования (тоже?). Я предполагаю, что это связано с тем, что все остальные тинги равны, одинаковый посев (или отсутствие посева) псевдослучайных генераторов. Я использовал его для создания уникальных имен файлов. Я обнаружил, что ОС намного лучше это делает:)

троллинг предупреждение

вы спрашиваете, являются ли GUID 100% уникальными. Это зависит от количества GUID, среди которых он должен быть уникальным. Как количество GUID приближается к бесконечности, вероятность дублирования GUID приближается к 100%.


в более общем смысле это известно как" проблема дня рождения "или"парадокс дня рождения". Википедия имеет довольно хороший обзор на: Википедия-Проблема С Днем Рождения

в очень грубых терминах квадратный корень из размера пула является грубым приближением того, когда вы можете ожидать 50% - ный шанс дубликата. Статья включает в себя таблицу вероятностей размера пула и различных вероятностей, включая строку для 2^128. Таким образом, для 1% вероятности столкновения вы бы ожидайте случайного выбора 2.6 * 10^18 128-битных чисел. Шанс 50% требует 2.2 * 10^19 выборов, в то время как SQRT(2^128) составляет 1.8*10^19.

конечно, это просто идеальный случай действительно случайного процесса. Как уже упоминалось, многое зависит от того, что случайные аспект - насколько хорош генератор и семя? Было бы неплохо, если бы была какая-то аппаратная поддержка, чтобы помочь с этим процессом, который был бы более пуленепробиваемым, за исключением того, что все может быть подделано или виртуализировано. Я подозреваю, что это может быть причиной того, что MAC-адреса/временные метки больше не включены.


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

псевдослучайные свойства JavaScript V8 Math.random() несколько Ужасный в уникальности, с столкновениями, часто приходящими после всего нескольких тысяч итераций, но V8 не единственный виновник. Я видел конфликты GUID в реальном мире, используя как PHP, так и Ruby-реализации GUID v4.

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

http://usecuid.org/


ответ " является ли GUID 100% уникальным?" просто "нет" .

  • Если вы хотите 100% уникальность GUID, то сделайте следующее.

    1. генерировать GUID
    2. проверьте, существует ли этот идентификатор GUID в столбце таблицы, где вы ищете uniquensess
    3. если существует, то перейти к шагу 1 Шаг 4 еще
    4. используйте этот GUID как уникальный.