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

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

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

Нет, не 100% ... Просто 99,99999999999999999999999999999999999999999999999999999999999999999999999999%;)

JohannesH 18.11.2009 13:37

Прежде всего, GUID не бесконечен, что означает, что буквальное значение «100% времени» означает, что независимо от того, как долго вы продолжаете генерировать GUID, они всегда будут уникальными. Это не тот случай. Кроме того, поскольку исходная реализация, в которой уникальный серийный номер / идентификатор / MAC-адрес сетевой карты использовалась для создания части ключа, больше не используется, по разным причинам GUID больше не является уникальным глобально. Однако это локально уникально. Другими словами, если вы продолжите генерировать идентификаторы GUID на одном компьютере, вы не получите дубликатов.

Lasse V. Karlsen 30.01.2010 02:55

@ojrac Я просто округляю вниз ...: P

JohannesH 04.02.2010 12:07

В дополнение к отличному комментарию Лассе: межмашинная уникальность GUID связана с используемой реализацией / алгоритмом. См .: википедия на GUIDS - большинство реализаций GUID на большинстве платформ (включая SQLCE 3.5) используют GUID типа 4, основанные на генераторах случайных чисел, поэтому они должны нормально переходить границы машины (ищите «4» после второго дефиса).

Aidanapword 07.07.2011 18:07

Что такое «гид, не зависящий от языка»?

Colonel Panic 13.10.2012 03:21

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

asavartsov 10.02.2013 01:40

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

Triynko 19.06.2013 19:01

128-битное значение достаточно велико, а алгоритм генерации достаточно уникален, так что если бы 1 000 000 000 GUID в секунду генерировались в течение 1 года, вероятность дублирования была бы только 50%. Или, если бы каждый человек на Земле сгенерировал 600000000 GUID, вероятность дублирования была бы только 50%. По данным: guidgenerator.com/online-guid-generator.aspx

Tono Nam 09.05.2014 21:46

@asavartsov Думаю тебе понравится Wasteaguid.info ^ _ ^

Navin 13.05.2014 07:04

Я не думаю, что это вообще что-то особенное.

devinbost 01.10.2014 21:31

Я до сих пор не понимаю этого желания играть.

Eduardo 14.10.2014 20:22

Я построил небольшую игру на основе этого: гид привязка Готов поспорить, ты не выиграешь!

Wilfred Knievel 14.04.2015 14:58

У меня было однажды, что один и тот же guid сгенерировал 9 раз одинаковый идентификатор,>. <Yikes !!

Donald Jansen 19.11.2015 11:21

Последний GUID, созданный моим приложением - клянусь, я видел его раньше.

user4843530 11.12.2015 02:00

Произошла интересная вещь - недавно я создал GUID для своего расширения Firefox, и он оказался таким же, как GUID идентификатора приложения Firefox. Безумно то, что это не было ошибкой. Он был создан с помощью модуля uuid Python. Странные вещи. Почему-то мне плохо ..

Transcendental 27.07.2016 11:11

@asavartsov У меня было то же чувство, пока я не понял, что идентификаторы GUID обычно включают в себя какую-то форму отметки времени, что означает, что в каждый момент времени любой GUID не генерируется является потраченным впустую GUID. Другими словами, вы не можете «тратить впустую» GUID.

François Beaune 29.07.2016 15:44

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

AlexCode 12.05.2017 12:15

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

Danielle Paquette-Harvey 18.02.2019 21:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
561
18
194 949
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Ответ принят как подходящий

While each generated GUID is not guaranteed to be unique, the total number of unique keys (2128 or 3.4×1038) is so large that the probability of the same number being generated twice is very small. For example, consider the observable universe, which contains about 5×1022 stars; every star could then have 6.8×1015 universally unique GUIDs.

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


Это несколько хороших статей о том, как создается 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/

Взаимодействие с другими людьми

Разве тогда они не были бы названы UUID? ;)

Arafangion 08.05.2009 10:23

GUID - это специфическая реализация стандарта UUID, разработанная корпорацией Майкрософт. Итак, и то, и другое. Глобальный уникальный идентификатор против универсального уникального идентификатора.

Adam Davis 08.05.2009 15:49

Технически это не 2 ^ 128, потому что в GUID v4 у вас есть одна шестнадцатеричная цифра, которая всегда будет 4 (эффективно удаляет 4 бита), а еще два бита также зарезервированы. Тем не менее, 2 ^ 122 действительных GUID V4 по-прежнему оставляет около 5x10 ^ 36, что для меня подойдет. и для тебя тоже. Каждая звезда должна будет принять около 1,1x10 ^ 14 идентификаторов GUID.

Andrew Shelansky 08.10.2010 22:53

Если вы похожи на меня, то вы захотите знать, что написано 2^128 примерно: 34,028,236,692,093,846,346,337,460,743,177,000,000. По статистике, если вы рассчитываете 1000 GUID каждую секунду, на получение дубликата все равно уйдут триллионы лет.

Entity 24.07.2012 08:01

Это не «очень маленький», он «очень ... очень маленький». Получите правильную английскую математику! :-П

Tipx 02.08.2012 06:37

Мне просто показалось забавным читать это, так что повеселитесь, ребята :) Тридцать четыре ундециллиона двадцать восемь дециллионов двести тридцать шесть нониллионов шестьсот девяносто два октиллиона девяносто три септиллиона восемьсот сорок шесть секстиллионов триста сорок шесть квинтиллионов триста тридцать семь квадриллионов четыреста шестьдесят триллионов семьсот сорок три миллиарда сто семьдесят семь миллионов

hjavaher 11.05.2013 08:45

Ух! ты легко сказать!

Phillip Senn 11.08.2013 04:33

@TheAdamGaskins, и если вы похожи на меня, вы заметите, что это почти полная точность, и захотите знать, что это именно: 340,282,366,920,938,463,463,374,607,431,768,211,456 (и вы заметите, что вы были выключены на степень 10 в вашем номере - это ~ 340 ундециллионов, а не ~ 34 ундециллионов)

Tim S. 22.08.2013 17:34

Я думаю, что просто сказать, что существует много возможных GUID, - это только часть ответа. Вам также необходимо знать, как рассчитывается GUID. Например, если вам нужно только 100 уникальных целых чисел (вместо GUID), и ваш метод будет выглядеть примерно так: if (IsItASunnyDay) then return 1 else return 2 ', у вас будет практически только два уникальных целых числа ...

Geert Immerzeel 20.09.2013 17:12

Как комментирует @GeertImmerzeel, вопрос о как, сгенерированном guid, является важным моментом. Прямо как в xkcd.com/221

Chris F Carroll 07.11.2013 16:24

Риск создания одних и тех же GUID может быть очень мал, но мы разработчики программного обеспечения, поэтому мы должны знать, что все, что может пойти не так, БУДЕТ ошибкой. Так что сохраняйте блоки try / catch;)

Paw Baltzersen 10.01.2014 13:16

@adam davis, вы сказали: the total number of unique keys (2^128 or 3.4×10^38) is so large that the probability of the same number being generated twice is very small не означает, что он не может дублировать. например: Действительное число бесконечно, но 1 функция, которая генерирует действительное число, не означает, что она не может генерировать дубликаты реального числа.

John Nguyen 16.07.2014 06:16

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

Chris Moschini 13.09.2016 21:13

@ChrisMoschini Затем нам нужно будет сохранить все созданные GUID, а затем сравнить их друг с другом, чтобы найти коллизию. Это займет очень, очень, очень много времени, даже с учетом всех новых устройств и более высоких скоростей. Вся эта проблема состоит в том, чтобы просто создать столкновение - но тогда становится гораздо более маловероятным, что они действительно столкнутся! Другими словами, прямо сейчас в мире может быть несколько идентичных GUID, но они, по всей вероятности, никогда не соприкоснутся друг с другом и, следовательно, никогда не столкнутся.

Adam Davis 13.09.2016 22:01

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

Adam Davis 13.09.2016 22:04

@AdamDavis Там много предположений. Все, что требуется для столкновения этих GUID, - это, скажем, объекты в процедурно сгенерированной игре-вселенной, где игроки иногда натыкаются друг на друга. Помните, что хранилище может быть распределено так же, как и поколение. Ваше предположение, что устройства могут генерировать несколько миллионов когда-либо, навсегда, звучит так, как будто 640 КБ хватит для всех. В любом случае, люди легкомысленно отвергают коллизию GUID, и ее нужно прекратить. Известные границы, когда это может произойти, а когда это вероятно, более объективны и полезны. И ближе, чем часто изображается.

Chris Moschini 13.09.2016 22:35

@ChrisMoschini: Возможно, вам стоит провести статистический анализ самостоятельно, учитывая сегодняшнее использование, и опубликовать ответ. Мне будет очень интересно прочитать ваше мнение об этом.

Adam Davis 13.09.2016 23:27

В сегодняшних новостях: spacetelescope.org/news/heic1620 «Наблюдаемая Вселенная содержит в десять раз больше галактик, чем считалось ранее» - так что уменьшите количество GUID на одну звезду еще на один порядок. Вы начинаете волноваться?

Mike Nakis 18.10.2016 23:43

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

Adam Davis 19.10.2016 00:35

Поэтому не существует ли риска, что если каждый из нас сгенерирует более 895 000 GUID, то мы получим недовольные письма о прекращении и воздержании от других звездных систем 5 × 10 ^ 22 в наблюдаемой Вселенной? Это могло серьезно засорить почтовую систему.

Penguino 10.09.2020 06:05

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

Вот отличная статья Раймонда Чена о руководствах:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx Взаимодействие с другими людьми Взаимодействие с другими людьми Взаимодействие с другими людьми

Эта статья довольно старая и относится к версии 1 для GUID. v4 не использует аппаратное обеспечение / время, а вместо этого использует алгоритм случайных чисел. en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm

Mani Gandham 13.12.2015 08:22

Эта ссылка не работает

Marcel 10.12.2019 10:08

Вот ссылка: devblogs.microsoft.com/oldnewthing/20080627-00/?p=21823

Olanrewaju O. Joseph 27.12.2019 04:04

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

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

Я думаю, что статья Чена относится к V1 алгоритма генерации GUID, который использует MAC-адрес и временную метку - в текущем V4 вместо этого используется псевдослучайное число: en.wikipedia.org/wiki/Globally_Unique_Identifier#Algorithm

Barrett 07.07.2009 18:37

MSDN:

There is a very low probability that the value of the new Guid is all zeroes or equal to any other Guid.

Is a GUID unique 100% of the time?

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

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

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

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

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

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

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

Kenny Hung 27.09.2018 22:10

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

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

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

Это будет верно только для руководств v1. Версия v4, которая де-факто является STD, больше не использует Mac-адреса, а использует псевдослучайное число.

Pita.O 17.06.2010 12:57

«тогда ваша система никогда не будет генерировать повторяющиеся идентификаторы GUID». Даже если бы все правила были соблюдены для guid v1, как вы говорите, ваша система все равно могла бы создавать дубликаты. Вы более правы, когда говорите: «Конфликты статистически маловероятны».

Nick Meldrum 18.02.2011 11:41

В качестве примечания, я играл с 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 содержат строку «марио». Это совпадение или за этим есть какое-то объяснение?

Теперь, когда поиск в Google, часть 4 в GUID, я обнаружил около 125 000 обращений с GUID тома.

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

Помните ту рекламу Super Mario Bros 3 из 80-х? Все эти люди кричат: «Марио! Марио! Марио!» во всем мире немного расстроила случайность Вселенной.

MGOwen 29.04.2010 09:05

Если вы вручную удалите Office 2010 с msiexec, в нем будут перечислены все идентификаторы GUID MSI офисной программы. Все они пишут 0FF1CE. Похоже, у Microsoft довольно ... вольная ... интерпретация того, как генерировать GUID;)

Mark Henderson 30.04.2011 07:21

Все GUID этих разделов были созданы вместе 17 декабря 2009 г. в 14:47:45 по всемирному координированному времени. Они уникальны для вашей машины, но указывать «mario» в качестве идентификатора узла неверно - это означает, что они не соответствуют RFC-4122. Точно так же идентификаторы GUID 0FF1CE подпадают под раздел «Обратная совместимость NCS» RFC-4122, но маловероятно, что Microsoft следует правилам NCS для этих значений.

Stephen Cleary 03.09.2011 06:44

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

CloudMeta 14.07.2014 19:37

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

Mariusz 01.06.2015 12:23

Они также играют с отправкой сообщений с использованием обратной орфографии. Т.е. компания, производящая воду в бутылках Evian = Naive.

Mariusz 01.06.2015 12:25

@StephenCleary Как вы узнали, когда были созданы GUID?

Bhushan Firake 27.01.2016 19:26

@BhushanFirake: Раньше у меня был онлайн-декодер GUID. Код все еще где-то есть, но сайт больше не работает.

Stephen Cleary 27.01.2016 19:40

Это Type 1 UUIDs - это видно по 1 в 11de. Исправленные 6 байтов UUID - это узел (то есть MAC-адрес) машины, генерирующей UUID. В этом случае MAC-адрес - 80-6d-61-72-69-6f. Вы заметите, что установлен высокий бит; это означает, что это не настоящий MAC-адрес; но вместо этого - псевдослучайно сгенерированный MAC-адрес

Ian Boyd 06.05.2020 18:28

Тот факт, что старший бит был установлен для обозначения «локально администрируемого» MAC-адреса, на самом деле является неправильным битом для установки. Это привело к тому, что десятилетия спустя в UuidCreateSequential была обнаружена ошибка. Люди в Microsoft ошибочно думали, что установленный высокий бит делает его «локализованным». Это хорошее и разумное предположение, но это неверно. На самом деле это 2-й младший бит старшего байта (?! Да, спасибо IEEE). Если бы Windows NT писалась сегодня, этот MAC-адрес, вероятно, читался бы как 02-6d-61-72-69-6f.

Ian Boyd 06.05.2020 18:43

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

Как это возможно на двух разных машинах? Я думал, что часть GUID - это имя машины? (не спорю ... просто спрашиваю)

John Cruz 07.09.2010 01:47

Это будет справедливо только для руководств v1, которые используют MAC-адреса (не имя компьютера) как часть генерации GUID. Версия v4, которая де-факто является STD, больше не использует Mac-адреса, а использует псевдослучайное число.

Xander 10.02.2011 16:52

Guid.NewGuid всегда генерирует GUID v4 (и всегда генерирует). У Тима, должно быть, были очень плохие источники энтропии.

Stephen Cleary 03.09.2011 06:45

Это когда-нибудь копировалось? это огромная проблема, если это так.

Zyo 18.11.2015 01:16

То же самое здесь при импорте очень больших наборов данных. Примерно из 10-100 миллионов вы получаете дубликаты от Guid.NewGuid

Stephan Baltzer 08.06.2019 11:57

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

There are on the order 230 personal computers in the world (and of course lots of hand-held devices or non-PC computing devices that have more or less the same levels of computing power, but lets ignore those). Let's assume that we put all those PCs in the world to the task of generating GUIDs; if each one can generate, say, 220 GUIDs per second then after only about 272 seconds -- one hundred and fifty trillion years -- you'll have a very high chance of generating a collision with your specific GUID. And the odds of collision get pretty good after only thirty trillion years.

... и он продолжает в следующем абзаце: «Но это ищет коллизию с конкретным GUID. [...] Так что, если мы заставим этот миллиард компьютеров работать, генерируя идентификаторы GUID со 122-битной случайностью, вероятность того, что два из них где-то там столкнутся, станет очень высокой. после того, как будет сгенерировано примерно 2 ^ 61 GUID. Поскольку мы предполагаем, что примерно 2 ^ 30 компьютеров выполняют 2 ^ 20 GUID в секунду, мы ожидаем столкновение примерно через 2 ^ 11 секунд, что составляет около часа. " (И, наконец, он объясняет, что, конечно, создается не так много GUID.)

Arjan 26.10.2013 14:08

У меня повторяющийся GUID.

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

"errors":[{"code":1,"message":"creator_guid: is already taken","guid":"C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

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

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

Их служба поддержки была ЧРЕЗВЫЧАЙНО вежливой и полезной, но они, должно быть, никогда раньше не сталкивались с этой проблемой, потому что после 3+ часов разговора по телефону с ними они не нашли решения. (FWIW, я очень впечатлен Neat, и этот глюк, каким бы неприятным он ни был, не изменил моего мнения об их продукте.)

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

orad 20.09.2013 01:22

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

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

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

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

http://usecuid.org/

От http://www.guidgenerator.com/online-guid-generator.aspx

What is a GUID?

GUID (or UUID) is an acronym for 'Globally Unique Identifier' (or 'Universally Unique Identifier'). It is a 128-bit integer number used to identify resources. The term GUID is generally used by developers working with Microsoft technologies, while UUID is used everywhere else.

How unique is a GUID?

128-bits is big enough and the generation algorithm is unique enough that if 1,000,000,000 GUIDs per second were generated for 1 year the probability of a duplicate would be only 50%. Or if every human on Earth generated 600,000,000 GUIDs there would only be a 50% probability of a duplicate.

Разве 50% -ный шанс дублирования достаточно высок, чтобы вызвать страх?

disklosr 26.01.2015 15:59

@disklosr да, этого достаточно, чтобы вызвать страх, если ваши системы генерируют 1 миллиард GUID в секунду. В крайне маловероятном случае, если вы создадите эту сумму, просто соедините два идентификатора GUID вместе ...

maxshuty 05.03.2019 21:35

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

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

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

Чтобы добавить 3 GUID, нужно быть очень, очень, очень, очень параноиком.

harsimranb 21.12.2016 22:22

@harsimranb Нет ... очень-очень-очень-очень параноик - это 6 GUID. Параноик - это одно, очень параноик - два, и т. д.

Suamere 27.11.2017 19:27

@Suamere Я создал сайт для расчета вашего параноидального уровня jogge.github.io/HowParanoidAmI

Jogge 13.08.2018 12:26

@Jogge xD Это потрясающе, лол. После 9 9 999999999 в вашей форме, я думаю, что Paranoia разрушит мой браузер.

Suamere 13.08.2018 23:16

Кажется, никто не упоминает фактическую математическую вероятность того, что это произойдет.

Во-первых, предположим, что мы можем использовать все 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 ГГц и тратит 10000 циклов на создание Guid и больше ничего не делает. Тогда потребуется ~ 111 лет, прежде чем они сгенерируют дубликат.

Я отредактировал ваш пост после эта почта - пожалуйста, отредактируйте, если я допустил ошибку;).

shA.t 04.01.2017 14:32

Привет, @Cine, у меня есть возможность отредактировать ваш ответ, но я решил не делать этого, потому что я хочу дать вам возможность сначала опровергнуть его, я, вероятно, через месяц приду, чтобы официально изменить его, если я этого не сделаю. не слышу от вас. Хотя я почти уверен, что ваша математика неверна. реальное уравнение для определения вероятности 1% таково: ((2 ^ 128-1) / 2 ^ 128) ^ ((n (n-1)) / 2) = 0,01. Ваш показатель ошибочен. это не просто n. Вам понадобится C (n, 2) (aka (n * (n-1)) / 2), чтобы вычислить все комбинации, когда вы генерируете «n» направляющих. Смотрите здесь для получения дополнительной информации

viggity 31.05.2017 22:02

Спасибо Cine, я тоже приблизился к n ^ 2/2, так как он такой огромный :)

viggity 02.06.2017 17:29

Потребовалось бы 10000 машин 111 лет, чтобы сгенерировать каждый возможный GUID, а затем сгенерировать дубликат. Однако дубликат может возникнуть задолго до того, как будут созданы все возможные идентификаторы GUID. Я думаю, что приблизительные временные рамки будут зависеть от того, насколько «случайным» является процесс генерации GUID.

George K 04.07.2018 18:29

@GeorgeK Я думаю, вы неправильно поняли ... Потребовалось бы 10000 машин 111 лет, чтобы иметь 1% шанс встретить дубликат. Но да, эта математика, конечно, предполагает, что генератор случайных чисел полностью случайный.

Cine 05.07.2018 06:30

У меня были случаи, когда 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.

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

Я думаю, проблема MAC заключалась в анонимности. Я считаю, что использование идентификатора, такого как MAC-адрес, с возможностью отмены, было проблемой конфиденциальности. Я считаю, что настоящий случайный выбор в оборудовании очень сложен? Cloudflare использует камеру и ряд лавовых ламп, но я думаю, что с точным пониманием физики даже это не случайно? Лавовая лампа Cloudflares RNG: Popularmechanics.com/technology/security/news/a28921/…

Jeff Block 29.08.2018 02:48

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

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

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

Это не делает его уникальным. Ваш алгоритм не сохраняет вновь созданный GUID в таблице. В следующий раз, когда вы создадите GUID, он может столкнуться с предыдущим. Если бы вы вставили GUID в таблицу, GUID уже мог быть вставлен другим одноранговым узлом между вами, проверив уникальность и вставив GUID в таблицу. GUID уникален только в ВАШЕЙ системе, поэтому, если вы импортируете или объедините две базы данных, они все равно могут столкнуться. Также GUID часто используются, когда у вас нет доступа к централизованной базе данных. Если бы у вас было, почему бы просто не вытащить идентификатор из базы данных?

Jogge 25.05.2020 14:41

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

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

Из WIKI:

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

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

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

GUID - это глобальный уникальный идентификатор.

Вкратце: (разгадка в названии)

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

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

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

Что, если вы получите два столкновения за одну секунду?

Wai Ha Lee 20.08.2019 14:36

Это наихудший случай, но все же у нас не может быть двух одинаковых Guid'ов, сгенерированных одновременно.

Adithya Sai 20.08.2019 15:41

Где-то утверждают, что нужно копировать из ответа на SO, а не из вопроса, но сейчас я не так уверен ....

Marcel 10.12.2019 10:07

Как насчет Guid.NewGuid (). ToString (). Replace ("-", "") + DateTime.Now.Ticks .... Не вызывает сомнений в уникальности и может использоваться в качестве первичного ключа

d-coder 11.06.2020 02:02

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