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



- это идентификатор GUID, уникальный 100% времени?



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

1363   19  

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/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 1 в 2^128
  • 1 в 340 undecillion (не волнуйтесь, undecillion не находится на викторина)
  • 1 в 3.4 × 10^38
  • 1 in 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 используется везде.

насколько уникален a Идентификатор 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, и этот глюк, несмотря на разочарование, не изменил моего мнения об их продукте.)

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

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

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

MSDN:

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

- это идентификатор GUID, уникальный 100% времени?

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

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

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

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

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

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

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

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

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

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

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

http://usecuid.org/

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

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

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

Comments

    Ничего не найдено.