Возможны ли конфликты GUID?

Я работаю над базой данных в SQL Server 2000, которая использует GUID для каждого пользователя, который использует приложение, к которому он привязан. Так или иначе, у двух пользователей появился тот же идентификатор GUID. Я знаю, что microsoft использует алгоритм для генерации случайного GUID, который имеет чрезвычайно низкий шанс вызвать столкновения, но возможен ли конфликт?

Ответ 1

В принципе, нет. Я думаю, что кто-то пошел с вашей базой данных. В зависимости от версии GUID, которую вы используете, значение является уникальным (для таких вещей, как GUID для версии 1), или как уникальными, так и непредсказуемыми (для таких вещей, как GUID версии 4). Реализация SQL Server для их функции NEWID(), по-видимому, использует 128-битное случайное число, поэтому вы не столкнетесь с конфликтом.

Для 1% вероятности столкновения вам нужно будет генерировать около 2 600 000 000 000 000 000 GUID.

Ответ 2

В основном они не возможны!, вероятность астрономически низкая.

Но... Я единственный человек, которого я знаю о том, что имел один раз GUID-сборник (yep!).

И я в этом уверен, и это было не ошибкой.

Как это произошло, в небольшом приложении, которое выполнялось на Pocket PC, в конце операции должна быть выпущена команда, которая имеет сгенерированный GUID. Команда после ее выполнения на сервере была сохранена в таблице команд на сервере вместе с датой выполнения. Однажды, когда я отлаживался, я выпустил команду модуля (с присоединенным новым GUID), и ничего не произошло. Я сделал это снова (с тем же guid, потому что guid был создан только один раз в начале операции), и снова, и ничего, наконец, пытаясь выяснить, почему команда не выполняется, я проверил таблицу команд, и тот же GUID, что и текущий, был вставлен 3 недели назад. Не веря этому, я восстановил базу данных с резервной копии за 2 недели, и там был гид. Проверяя код, новый guid был свежеприготовлен без сомнений. Pow guid collision, произошло только один раз, но я действительно хотел бы, чтобы я выиграл в лото вместо этого, шанс больше:).

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

Ответ 3

Они теоретически возможны, но с 3.4E38 возможных чисел, если вы создадите десятки триллионов GUID в год, вероятность того, что один дубликат будет 0.00000000006 (Источник).

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

Ответ 4

Сначала рассмотрим вероятность столкновения двух GUID. Это не так, как утверждают другие ответы, 1 из 2 ^ 128 (10 ^ 38) из-за парадоксальный день рождения, что означает, что для Вероятность 50% двух GUID, сталкивающихся с вероятностью, фактически равна 1 в 2 ^ 64 (10 ^ 19), что намного меньше. Тем не менее, это все еще очень большое число, и поэтому вероятность столкновения, предполагающая, что вы используете разумное количество GUID, низкая.

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

Итак, по сути, ответ да, возможны столкновения. Но они маловероятны.

Изменить: исправлено, чтобы сказать 2 ^ 64

Ответ 5

Вероятность столкновения двух случайных GUID (~ 1 в 10 ^ 38) ниже вероятности не обнаруживать поврежденный пакет TCP/IP (~ 1 в 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf, стр. 11. Это также относится к дискам, компакт-дискам и т.д.

GUID являются статистически уникальными, и данные, которые вы читаете из db, являются только статистически корректными.

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

Два компьютера Win95, у которых есть сетевые карты с дублирующимися MAC-адресами, выдают повторяющиеся GUID в условиях жесткого контроля, особенно если, например, питание отключается в здании, и они оба загружаются точно в одно и то же время.

Ответ 9

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

Ответ 10

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

Ответ 11

Конечно, это возможно.... Возможно? Скорее всего, но это возможно.

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

Ответ 12

Просто для усмешки, попробуйте следующий script... (работает на SQL 2005, не уверен около 2000)

declare @table table
(
    column1 uniqueidentifier default (newid()),
    column2 int,
    column3 datetime default (getdate())
)

declare @counter int

set @counter = 1

while @counter <= 10000
begin
    insert into @table (column2) values (@counter)
    set @counter = @counter + 1
end

select * from @table

select * from @table t1 join @table t2 on t1.column1 = t2.column1 and t1.column2 != t2.column2

Выполнение этого повторения (занимает меньше секунды) дает довольно широкий диапазон от первого выбора, даже с ЧРЕЗВЫЧАЙНЫМ временным промежутком. Пока второй выбор не произвел ничего.

Ответ 13

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

Лично я бы посмотрел в другом месте, так как скорее это ошибка, а не GUID-столкновение...

Предоставление, конечно, того, что вы не отрубаете бит с идентификатора GUID, чтобы сделать его короче.

Ответ 14

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

Ответ 15

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

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

Ответ 16

Очень маловероятно, что вы столкнетесь с конфликтами GUID, если вы их генерируете с помощью функции NEWID() в SQL Server (хотя, конечно, возможно, как подчеркивали другие ответы). Одна вещь, о которой они не указали, заключается в том, что на самом деле вполне вероятно, что вы столкнетесь с конфликтами, если вы генерируете GUID в JavaScript в браузерах в дикой природе. Иногда в RNG иногда возникают проблемы с RNG, но у меня также возникают проблемы, когда пауки Google, похоже, кэшируют результаты подобных функций и в конечном итоге повторяют один и тот же GUID до наших систем.

См. различные ответы здесь для более подробной информации:

Коллизии при создании UUID в JavaScript?