Вопрос

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

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

Это было полезно?

Решение

Хотя каждый сгенерированный GUID не гарантированно уникален, общее количество уникальных ключей (2128 или 3.4×1038) настолько велико, что вероятность того, такое же количество сгенерировано два раза очень мала.Для примера рассмотрим наблюдаемую вселенную, которая содержит примерно 5 × 1022 звезды;тогда каждая звезда могла бы иметь 6.8×1015 универсально уникальные идентификаторы GUID.

От Википедия.


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

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/

​​

Другие советы

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

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

Теперь, когда

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

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

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

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

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

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

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

Я предпринял попытку описать полезность 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,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))

Каким будет Wolfram Alpha 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 года генерируется 1 000 000 000 идентификаторов GUID в секунду, вероятность дублирования составит всего 50%. Или, если бы каждый человек на Земле генерировал 600 000 000 идентификаторов GUID, вероятность дубликата была бы только 50%.

MSDN :

  

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

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

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

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

Я обнаружил дубликат GUID.

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

  

" ошибки ": [{" code ": 1, " message " " creator_guid: уже существует   приняты & Quot;, & Quot; & справ Quot;: & Quot; C83E5734-D77A-4B09-B8C1-9623CAC7B167 & Quot;}]}

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

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

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

  

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

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

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

Псевдослучайные свойства JavaScript Math.random () в V8 являются УЖАСНЫМИ с уникальностью, а коллизии часто происходят после нескольких тысяч итераций, но V8 не единственный виновник. Я видел реальные коллизии GUID с использованием реализаций GUID v4 как в PHP, так и в Ruby.

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

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

http://usecuid.org/

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

Троллинг оповещения

Вы спрашиваете, являются ли 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.

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

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

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

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

Самое сложное - это не создание дублированного Guid.

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

Из Вики:

Например, количество случайных UUID версии 4, которые должны быть сгенерированы для того, чтобы иметь 50% -ную вероятность хотя бы одного столкновения, составляет 2,71 квинтиллиона, рассчитывается следующим образом:

введите описание изображения здесь

Это число эквивалентно генерации 1 миллиарда UUID в секунду в течение примерно 85 лет, и файл, содержащий такое количество UUID, по 16 байт на UUID, будет примерно 45 эксабайт, во много раз больше, чем самые большие базы данных, существующие в настоящее время, которые имеют порядок сотен петабайт

GUID обозначает Глобальный уникальный идентификатор

Вкратце: (подсказка в названии)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top