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

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

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

Ответ 1

Хотя каждый сгенерированный GUID не гарантированно является уникальным, общее количество уникальных ключей (2 128 или 3,4 × 10 38) настолько велико, что вероятность того, что одно и то же число будет сгенерировано дважды, очень мала. Например, рассмотрим наблюдаемую вселенную, которая содержит около 5 × 10 22 звезд; тогда каждая звезда может иметь 6,8 × 10 15 универсально уникальных 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

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

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

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

Ответ 3

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

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

Ответ 4

В качестве побочного примечания я играл с 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.

Ответ 5

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

Вот отличная статья Раймонда Чена о гидах:

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

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

  • 1 в 2 ^ 128
  • 1 из 340 undecillion (не беспокойтесь, unecillion не на викторины)
  • 1 в 3.4 × 10 ^ 38
  • 1 в 340 000 000 000 000 000 000 000 000 000 000 000 000 000 000

Ответ 10

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

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

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

(1-1/2 128) (1-2/2 128)... (1- (п-1)/2 128)

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

(1-1/2 128) п (п-1)/2

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

(1-1/2 128) п ^ 2/2

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

(1-1/2 128) n ^ 2/2= 0,01

Что мы решаем для n и получаем:

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

Какая Wolfram Alpha будет 5.598318 × 10 19

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

Ответ 11

Из 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%.

Ответ 12

MSDN:

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

Ответ 13

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

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

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

Ответ 14

У меня был двойной идентификатор GUID.

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

"errors": [{ "code": 1, "message": "creator_guid: уже приняты", "GUID": "C83E5734-D77A-4B09-B8C1-9623CAC7B167" }]}

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

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

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

Ответ 15

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

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

Ответ 16

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

Псевдослучайные свойства V8 JavaScript Math.random() являются ТЕРРИБИЛЬНЫМИ при уникальности, причем столкновения часто возникают после нескольких тысяч итераций, но V8 не единственный виновник. Я видел конфликты GUID реального мира, использующие как PHP, так и Ruby реализации GUID v4.

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

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

http://usecuid.org/

Ответ 17

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

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

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

Ответ 18

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

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

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

Ответ 19

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

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

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

Ответ 20

Самое сложное не в том, чтобы создать дублированный Guid.

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

Из Вики:

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

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

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

Ответ 21

GUID расшифровывается как глобальный уникальный идентификатор

Вкратце: (ключ к названию)

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

Ответ 22

Для лучшего результата лучше всего добавить GUID с отметкой времени (просто чтобы убедиться, что она остается уникальной)

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