Возможны ли коллизии GUID? - PullRequest
108 голосов
/ 09 октября 2008

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

Ответы [ 16 ]

2 голосов
/ 09 октября 2008

Конечно, это возможно .... Возможно? Маловероятно, но возможно.

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

1 голос
/ 31 октября 2008

Только ради улыбок попробуйте следующий скрипт ... (работает на 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

Повторное выполнение (занимает менее секунды) приводит к довольно широкому диапазону от первого выбора, даже с ОЧЕНЬ коротким промежутком времени. Пока что второй выбор ничего не дал.

0 голосов
/ 18 января 2016

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

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

Коллизии при генерации UUID в JavaScript?

0 голосов
/ 09 октября 2008

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

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

0 голосов
/ 09 октября 2008

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

0 голосов
/ 09 октября 2008

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

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

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

...