Является ли GUID уникальным в 100% случаев?
Он останется уникальным для нескольких потоков?
language-agnostic
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/
источник
2^128
выписано приблизительно:34,028,236,692,093,846,346,337,460,743,177,000,000
. По статистике, если вы подсчитываете 1000 GUID каждую секунду, для получения дубликата все равно потребуется триллионы лет.Если вы боитесь одинаковых значений GUID, поместите два из них рядом друг с другом.
Если вы слишком параноик, тогда поставьте три.
источник
999999999
Я думаю, что после 9 9 в твоей форме Паранойя изменит мой Браузер.Простой ответ - да.
Раймонд Чен (Raymond Chen) написал отличную статью о GUID и о том, почему подстроки GUID не гарантируются уникальными. В этой статье мы подробно расскажем о том, как генерируются идентификаторы GUID и данные, которые они используют для обеспечения уникальности, что должно объяснить, почему они таковы :-)
источник
Как примечание, я играл с томами GUID в Windows XP. Это очень непонятная структура разделов с тремя дисками и четырнадцатью томами.
Дело не в том, что GUID очень похожи, а в том, что во всех GUID есть строка «mario». Это совпадение или есть объяснение этому?
Теперь при поиске части 4 в GUID я обнаружил около 125 000 обращений с томами GUID.
Вывод: когда дело касается томов GUID, они не так уникальны, как другие GUID.
источник
msiexec
, в нем перечислены все идентификаторы GUI MSI офисной программы. Они все по буквам0FF1CE
. Похоже, что у Microsoft довольно ... свободная ... интерпретация того, как генерировать GUID;)0FF1CE
GUID попадают в раздел «Обратная совместимость NCS» в RFC-4122, но маловероятно, что Microsoft соблюдает правила NCS для этих значений.Этого не должно быть. Однако, когда .NET находится под большой нагрузкой, возможно получить дубликаты руководств. У меня есть два разных веб-сервера, использующие два разных сервера SQL. Я пошел, чтобы объединить данные и обнаружил, что у меня было 15 миллионов направляющих и 7 дубликатов.
источник
Guid.NewGuid
всегда генерирует GUID v4 (и всегда имеет). У Тима, должно быть, были чрезвычайно плохие источники энтропии.Да, GUID всегда должен быть уникальным. Он основан как на оборудовании, так и на времени, плюс несколько дополнительных битов, чтобы убедиться, что он уникален. Я уверен, что теоретически возможно получить два одинаковых, но крайне маловероятно в реальном сценарии.
Вот отличная статья Раймонда Чена о гидах:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
источник
Направляющие статистически уникальны. Шансы двух разных клиентов, генерирующих один и тот же Guid, бесконечно малы (при условии отсутствия ошибок в коде, генерирующем Guid). Вы можете также беспокоиться о сбое вашего процессора из-за космического луча и принятия решения, что 2 + 2 = 5 сегодня.
Несколько потоков, выделяющих новые направляющие, получат уникальные значения, но вы должны понимать, что вызываемая вами функция является поточно-ориентированной. В какой среде это?
источник
Эрик Липперт написал очень интересную серию статей о GUID.
источник
Теоретически нет, они не уникальны. Можно генерировать идентичный гид снова и снова. Однако шансы на то, что это произойдет, настолько низки, что можно предположить, что они уникальны.
Я читал ранее, что шансы настолько малы, что вам действительно нужно беспокоиться о чем-то другом - например, о том, что ваш сервер самопроизвольно сгорает, или о других ошибках в вашем коде. То есть, предположите, что он уникален, и не создавайте никакого кода, чтобы «ловить» дубликаты - тратьте свое время на что-то более вероятное (то есть на что - то еще).
Я попытался описать полезность GUID для аудитории моего блога (нетехнических членов семьи). Оттуда (через Википедию) вероятность создания дубликата GUID:
источник
Никто, кажется, не упоминает фактическую математику вероятности его возникновения.
Во-первых, давайте предположим, что мы можем использовать все 128-битное пространство (Guid v4 использует только 122-битные).
Мы знаем, что общая вероятность НЕ получить дубликат в
n
пиках:Поскольку 2 128 намного больше, чем
n
, мы можем приблизить это к:И поскольку мы можем предположить
n
, что он намного больше 0, мы можем приблизить его к:Теперь мы можем приравнять это к «приемлемой» вероятности, скажем, 1%:
За что мы решаем
n
и получаем:Какой Wolfram Alpha получит 5,598318 × 10 19
Чтобы представить это число в перспективе, давайте возьмем 10000 машин, каждая из которых имеет 4-ядерный процессор, работает на частоте 4 ГГц и тратит 10000 циклов на генерацию Guid и больше ничего не делает. Затем потребуется около 111 лет, прежде чем они создадут дубликат.
источник
С http://www.guidgenerator.com/online-guid-generator.aspx
источник
Я испытал дубликат GUID.
Я использую настольный сканер Neat Receipts, и он поставляется с проприетарным программным обеспечением для баз данных. В программном обеспечении есть функция синхронизации с облаком, и я получал сообщение об ошибке при синхронизации. Гусак на бревнах показал удивительную черту:
Я немного не поверил, но, конечно же, когда я нашел путь к своей локальной базе данных neatworks и удалил запись, содержащую этот GUID, ошибка перестала возникать.
Таким образом, чтобы ответить на ваш вопрос с неподтвержденными данными, нет. Дубликат возможен. Но вполне вероятно, что причина, по которой это произошло, была не случайностью, а из-за несоблюдения какой-либо стандартной практики. (Мне просто не везет) Однако точно сказать не могу. Это не мое программное обеспечение.
Их служба поддержки была ОЧЕНЬ вежливой и предупредительной, но они никогда не сталкивались с этой проблемой раньше, потому что после трех с лишним часов разговора по телефону они не нашли решения. (FWIW, Я очень впечатлен Neat, и этот глюк, хотя и расстраивающий, не изменил мое мнение об их продукте.)
источник
MSDN :
источник
Если ваши системные часы настроены правильно и не были обернуты, и если у вашей сетевой карты есть свой собственный MAC (то есть вы не установили пользовательский MAC), и ваш поставщик сетевой карты не перерабатывал MAC (что они не должны делать) но это, как известно, происходило), и если функция генерации GUID вашей системы правильно реализована, то ваша система никогда не будет генерировать дубликаты GUID.
Если каждый на земле, кто генерирует GUID, следует этим правилам, тогда ваши GUID будут глобально уникальными.
На практике количество людей, нарушающих правила, невелико, и их GUID вряд ли "сбегут". Конфликты статистически маловероятны.
источник
Не гарантируется, так как существует несколько способов создания одного. Однако вы можете попытаться рассчитать вероятность создания двух идентичных идентификаторов GUID, и вы поймете, что идея: идентификатор GUID имеет 128 битов, следовательно, имеется 2 128 различных идентификаторов GUID - намного больше, чем звезд в известной вселенной. Прочитайте статью в Википедии для более подробной информации.
источник
В более общем смысле это известно как «проблема дня рождения» или «парадокс дня рождения». Википедия имеет довольно хороший обзор по адресу: Википедия - день рождения проблема
В очень грубых выражениях, квадратный корень из размера пула является приблизительным приближением, когда можно ожидать 50% вероятности дублирования. Статья включает в себя таблицу вероятностей размера пула и различных вероятностей, включая строку для 2 ^ 128. Таким образом, для вероятности коллизии в 1% вы можете случайно выбрать 2,6 * 10 ^ 18 128-битных чисел. Вероятность 50% требует 2,2 * 10 ^ 19 пиков, в то время как SQRT (2 ^ 128) составляет 1,8 * 10 ^ 19.
Конечно, это просто идеальный случай действительно случайного процесса. Как уже упоминалось, многое зависит от этого случайного аспекта - насколько хороши генератор и семена? Было бы хорошо, если бы была некоторая аппаратная поддержка, чтобы помочь с этим процессом, который был бы более пуленепробиваемым, за исключением того, что все может быть подделано или виртуализировано. Я подозреваю, что это может быть причиной того, что MAC-адреса / временные метки больше не включены.
источник
Для лучшего результата лучше всего добавить GUID с отметкой времени (просто чтобы убедиться, что она остается уникальной)
источник
Алгоритмы GUID обычно реализуются в соответствии со спецификацией GUID v4, которая по сути является псевдослучайной строкой. К сожалению, они попадают в категорию «вероятно, не уникальных» , из Википедии (я не знаю, почему так много людей игнорируют этот бит): «... другие версии GUID имеют разные свойства уникальности и вероятности, начиная от гарантированной уникальности скорее всего, не уникальность. "
Псевдослучайные свойства JavaScript V8
Math.random()
ужасны в своей уникальности, часто возникают коллизии после нескольких тысяч итераций, но V8 не единственный виновник. Я видел реальные коллизии GUID с использованием реализаций GUID v4 как в PHP, так и в Ruby.Поскольку масштабирование генерации идентификаторов на нескольких клиентах и кластерах серверов становится все более распространенным явлением, энтропия имеет большой успех - вероятность того, что одно и то же случайное начальное число используется для генерации повышенного идентификатора (время часто используется как случайное начальное число в псевдослучайных генераторах), и коллизии GUID увеличиваются от «вероятно, не уникального» до «очень вероятно, вызовет много проблем».
Чтобы решить эту проблему, я решил создать алгоритм идентификации, который мог бы безопасно масштабироваться и обеспечивать более надежную защиту от столкновений. Для этого используются временная метка, счетчик клиента в памяти, отпечаток клиента и случайные символы. Комбинация факторов создает дополнительную сложность, которая особенно устойчива к коллизиям, даже если вы масштабируете ее на нескольких хостах:
http://usecuid.org/
источник
Я видел, что GUID не были уникальными во время многопоточного / многопроцессорного юнит-тестирования (тоже?). Я предполагаю, что это связано с тем, что при прочих равных условиях происходит одинаковое заполнение (или отсутствие заполнения) псевдослучайных генераторов. Я использовал его для генерации уникальных имен файлов. Я обнаружил, что ОС намного лучше делает это :)
Троллинг оповещения
Вы спрашиваете, являются ли GUID уникальными на 100%. Это зависит от количества идентификаторов GUID, среди которых оно должно быть уникальным. Поскольку количество идентификаторов GUID приближается к бесконечности, вероятность дублирования идентификаторов GUID приближается к 100%.
источник
Ответ "Является ли GUID уникальным на 100%?" это просто "Нет" .
Если вы хотите 100% уникальность GUID, сделайте следующее.
источник
Самое сложное не в создании дублируемого Guid.
Самая сложная часть - это база данных, в которой хранятся все сгенерированные, чтобы проверить, действительно ли она дублирована.
Из Вики:
Например, число случайных UUID версии 4, которые должны быть сгенерированы для того, чтобы иметь вероятность 50%, по крайней мере, одного столкновения, составляет 2,71 квинтиллиона, вычисляемое следующим образом:
введите описание изображения здесь
Это число эквивалентно генерации 1 миллиарда UUID в секунду в течение примерно 85 лет, и файл, содержащий такое количество UUID, по 16 байт на UUID, будет примерно 45 эксабайт, во много раз больше, чем самые большие базы данных, которые в настоящее время существуют, порядка сотен петабайт
источник
GUID расшифровывается как глобальный уникальный идентификатор
Вкратце: (ключ в названии)
Подробно: GUID разработаны так, чтобы быть уникальными; они рассчитываются случайным методом на основе часов компьютера и самого компьютера. Если вы создаете много идентификаторов GUID в одну и ту же миллисекунду на одной и той же машине, возможно, они могут совпадать, но почти для всех обычных операций их следует считать уникальными.
источник