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

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

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

Ответы [ 21 ]

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

С 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%.

4 голосов
/ 08 марта 2013

У меня был дубликат GUID.

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

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

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

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

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

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

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

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

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

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

MSDN :

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

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

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

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

1 голос
/ 22 сентября 2017

В более общем смысле это известно как «проблема дня рождения» или «парадокс дня рождения». Википедия имеет довольно хороший обзор по адресу: Википедия - проблема дня рождения

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

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

1 голос
/ 24 августа 2017

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

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

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

1 голос
/ 27 июня 2013

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

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

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

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

http://usecuid.org/

0 голосов
/ 04 апреля 2019

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

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

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

0 голосов
/ 09 января 2019

Самое сложное не в создании дублирующегося Guid.

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

Из Вики:

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

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

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

...