Сколько раз вы можете случайным образом сгенерировать GUID, прежде чем рискнуть дублировать? (.СЕТЬ) - PullRequest
5 голосов
/ 11 апреля 2010

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

Если бы вы сгенерировали одну копию для каждой копии Windows в мире, они бы столкнулись?

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

Ответы [ 7 ]

7 голосов
/ 11 апреля 2010

Есть ~ 3E38 возможных значений GUID. Но парадокс дня рождения сокращает шансы 50/50 на создание дубликата GUID до ~ 1E19. Несмотря на то, что это огромное число, что весьма благоприятно по сравнению с вероятностью того, что ваша машина будет разрушена в результате удара метеорита в первую очередь, системные часы используются, чтобы избежать дублирования.

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

5 голосов
/ 11 апреля 2010

GUID имеет компоненты на основе

  • Время (Системные часы)

  • Пробел (MAC-адрес системы)

  • Случайные числа

Так, если один генерируется для каждой машины в мире в то же время, они будут отличаться по MAC и случайным числам

Вот полезная ссылка. http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

1 голос
/ 11 апреля 2010

Проведя последние 25 лет, работая с RPC и COM (где GUID и UUID имеют решающее значение) и работая с распределенными базами данных, где GUID используются в качестве уникальных идентификаторов строк, я никогда не сталкивался с проблемой коллизий - были ли они созданы на отдельные машины или разные машины. Еще один интересный пример из MSDN, где в качестве rowids они живут намного дольше, чем в виде объектов: http://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and-why-it-matters.aspx

1 голос
/ 11 апреля 2010

Трудно рассчитать шансы, не зная внутренних деталей реализации генератора GUID.

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

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

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

0 голосов
/ 20 апреля 2010

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

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

Вы должны были бы генерировать миллионы или миллиарды, чтобы это было даже отдаленной возможностью.

0 голосов
/ 11 апреля 2010

Просто добавьте к правильному ответу Midhat, вот цитата из Блог Эрика Липперта о ситуации, когда в системе не установлена ​​сетевая карта (следовательно, нет MAC-адреса):

(Машины, у которых нет сетевых карт, генерируют специальные GUID, которые находятся в диапазоне «известно, что они потенциально не уникальны».)

0 голосов
/ 11 апреля 2010

Это заняло бы очень много времени!

...