Возможны ли столкновения GUID?


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

16 104

16 ответов:

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

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

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

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

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

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

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

они теоретически возможны, но с 3. 4e38 возможных чисел, если вы создаете десятки триллионов GUID в год шанс иметь один дубликат составляет 0,00000000006 (источник).

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

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

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

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

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

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

GUID статистически уникальны, и данные, которые Вы читаете из БД, только статистически корректны.

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

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

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

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

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

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

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

конечно, это возможно....Вероятно? Вряд ли, но это возможно.

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

просто для усмешки, попробуйте следующий скрипт... (работает на 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

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

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

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

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

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

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

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

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

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

коллизии при создании UUIDs в JavaScript?