Можно ли считать GUID всегда уникальным?

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

Бонусный вопрос

Оптимальный способ тестирования GUID для уникальности? Может быть, фильтр цветка?

Ответ 1

Да, вы можете. Поскольку идентификаторы GUID имеют длину 128 бит, есть, по общему признанию, минутная возможность столкновения, но слово "минута" нигде не достаточно сильное. Есть так много GUID, что, если вы производите несколько триллионов из них случайным образом, вы все равно чаще попадаете в метеорит, чем за одно столкновение (от Wikipedia). И если вы не генерируете их случайным образом, но, например, используя алгоритм MAC-address-and-time-stamp, тогда они также будут уникальными, поскольку MAC-адреса уникальны среди компьютеров, а метки времени уникальны на вашем компьютере.

Изменить 1: Чтобы ответить на ваш вопрос о бонусе, оптимальный способ проверить набор идентификаторов GUID для уникальности - просто предположить, что все они уникальны. Зачем? Поскольку, учитывая количество идентификаторов GUID, которые вы генерируете, вероятность столкновения с GUID меньше, чем вероятность того, что космический луч перевернется немного в вашей компьютерной памяти и привнесет ответ, полученный любым "точным" алгоритмом, который вам нужен бежать. (См. fooobar.com/questions/15161/... для математики.)

Существует огромное количество GUID. Чтобы процитировать Дугласа Адамса "Автостопом по галактике":

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

И поскольку есть около 7 × 10 22 звезд во Вселенной и чуть меньше 2 128 GUID, то для каждой отдельной звезды примерно 4,86 ​​× 10 15 - почти пять квадриллионов-GUID. Если бы каждая из этих звезд имела мир с таким процветающим населением, как наша, то вокруг каждой звезды, каждый человек или инопланетянин, который когда-либо жил будет иметь право на более чем сорок пять тысяч идентификаторов GUID. Для каждого человека в истории у каждой звезды во вселенной. Пространство GUID находится на том же уровне, что и размер всей вселенной. Вам не нужно беспокоиться.

( Изменить 2: Отражая это: ничего себе. Я не осознал, что это значит. Пространство GUID непостижимо массивное. Я в восторге от этого.)

Ответ 2

Короткий ответ: для практических целей да.

Однако вы должны учитывать парадокс дня рождения!

Я вычислил несколько репрезентативных вероятностей столкновений. С 122-разрядными UUID, указанными в статье в Википедии, вероятность столкновения равна 1/2, если вы создаете не менее 2.71492e18 UUID. При 10 ^ 19 UUID вероятность равна 0.999918. С 10 ^ 17 UUID, 0.000939953.

Некоторые цифры для сравнения можно найти в Википедии. Таким образом, вы можете безопасно назначить UUID для каждого человека, который жил, каждая галактика в наблюдаемой вселенной, каждой рыбы в океане и каждого человека ant на Земле. Однако столкновения почти наверняка, если вы создаете UUID для каждого транзистора, который производит человечество за год, каждое насекомое на Земле, каждое зерно песка на Земле, каждая звезда в наблюдаемой вселенной или что-то большее.

Если вы создадите 1 миллиард UUID в секунду, потребуется около 36 лет, чтобы получить вероятность столкновения 10%.

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

Ответ 3

В общем, да, можно с уверенностью предположить.

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

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

Ответ 4

Анализ возможности столкновения доступен в Википедии: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

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

Существует также возможность ошибки в коде генератора GUID; в то время как шансы малы, они, вероятно, выше шансов столкновения на основе математики.

Возможно, потребуется фильтр Bloom; он может быстро сказать вам, является ли GUID уникальным, но есть вероятность ложного указания на столкновение. Альтернативный метод, если вы тестируете пакет за раз, состоит в сортировке партии и сравнении каждого последующего элемента.

Ответ 5

В то время как столкновение возможно, оно ВЫСОКО маловероятно. (Math здесь.) Можно с уверенностью предположить, что они действительно различны.