Чи безпечно припускати, що GUID завжди буде унікальним?


123

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

Бонусне питання

Оптимальний спосіб перевірити GUID на унікальність? Блум-фільтр, можливо?


2
можливий дублікат Чи унікальний GUID у 100% часу?
ChrisF

29
Не якщо ми всі на цьому веб-сайті продовжуватимете
натискати

12
Я звинувачую всі свої помилки в зіткненні GUID. Це має статися якийсь час, правда?
Майкл

8
Набагато ймовірніше, що акула з прекрасним розмальованим малюнком забарвленням впаде з неба і розтрощить ваш комп’ютер шматочками, тому я б запевнив, що вживати запобіжних заходів проти цього, є більш правильним розподілом ресурсів як частиною загального зниження ризику. план.
Девід Гладфелтер

4
@mipadi: чудове посилання! Я просто можу сфотографувати якогось розробника десь скуголить "Guuuuys! Перестань витрачати GUIDs! Мені це потрібно !"
FrustratedWithFormsDesigner

Відповіді:


360

Так, ти можеш. Оскільки у GUID довжина 128 біт, то, мабуть, є й хвилинна можливість зіткнення, але слово "хвилина" ніде не є досить сильним. Є так багато GUID, що якщо ви генеруєте їх кілька трильйонів випадковим чином, ви все ж більше шанси потрапити на метеорит, ніж мати навіть одне зіткнення (з Вікіпедії ). І якщо ви не генеруєте їх випадковим чином, але, наприклад, використовуєте алгоритм MAC-адреса та часу, то вони також будуть унікальними, оскільки MAC-адреси унікальні серед комп'ютерів, а часові позначки унікальні на вашому комп’ютер.

Редагувати 1: Щоб відповісти на ваше бонусне питання, оптимальним способом перевірити набір GUID на унікальність - просто припустити, що всі вони унікальні. Чому? Тому що, враховуючи кількість створених вами GUID, шанси зіткнення GUID менші, ніж шанси космічного променя, який трохи загорнеться в пам’яті вашого комп’ютера та викручує відповідь, надану будь-яким «точним» алгоритмом, який би вам не доглядав бігти. (Дивіться цю відповідь StackOverflow на математику.)

Існує величезна кількість GUIDs там. Щоб процитувати Посібник автостопом Дугласа Адамса по Галактиці :

"Космос, - йдеться, - великий". Дійсно великий. Ви просто не повірите, наскільки він надзвичайно великий, мабуть, великий. Я маю на увазі, ви можете подумати, що це довгий шлях до хіміка, але це просто арахіс до космосу , слухай ... "

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

( Edit 2: Розмірковуючи про це: нічого собі , я не зрозумів. Себе , що це означає ідентифікатор GUID простір незбагненно масивне Я начебто в захваті від нього ...)


1
Також WolframAlpha повідомляє, що на кожну клітинку кожної людини, яка коли-небудь жила, існує 36 трильйонів UUID. У вас є 10^14клітини у вашому тілі, і 106,5 мільярда людей коли-небудь жили. Або 2.385 * 10^23UUID на кожен цент держборгу США.
new123456

5
Хоча цифри все ще високі, шанси зіткнення GUID перевищують 50% при 2 ^ 64 GUID.
NullUserException

1
За 2 ^ 64 GUID, це зменшило б число до одного (0,00026) на зірку у Всесвіті та 2 * 10 ^ (- 15) для кожного людини чи прибульця, який коли-небудь жив. Це все одно дозволить отримати понад 170 мільйонів GUID для кожної людини, яка коли-небудь жила, тому я думаю, що ми все ще хороші.
NullUserException

12
Варто зазначити, що зіткнення GUID - це також лише проблема, якщо він знаходиться в одному бізнес-просторі. GUID, який я використовую для ідентифікації компонента в програмному забезпеченні, може бути таким же, як і GUID, який ви використовуєте в рядку бази даних у власному додатку, не викликаючи жодних проблем
Джеймс Торп

1
Той факт, що є 2 ^ 128 ПОПЕРЕДЖЕННЯ, не має значення, і ви не «ще добрі» при 50%
шансах

40

Коротка відповідь: для практичних цілей, так.

Однак ви повинні врахувати парадокс дня народження!

Я обчислив кілька репрезентативних ймовірностей зіткнення. З 122-бітними UUID, як зазначено в статті Вікіпедії , ймовірність зіткнення становить 1/2, якщо ви генеруєте щонайменше 2.71492e18UUID. З 10 ^ 19 UUID, ймовірність дорівнює 0,999918. З 10 ^ 17 UUID, 0,000939953.

Деякі цифри для порівняння можна знайти у Вікіпедії. Таким чином, ви можете сміливо призначати UUID кожній людині, яка жила, кожній галактиці у спостережуваному Всесвіті, кожній рибі в океану та кожному окремому мурашню на Землі. Однак зіткнення майже певні, якщо ви генеруєте UUID для кожного транзистора, який людство виробляє за рік, кожного комаха на Землі, кожного піску на Землі, кожної зірки у спостережуваному Всесвіті чи чогось більшого.

Якщо ви генеруєте 1 мільярд UUID в секунду, знадобиться приблизно 36 років, щоб отримати ймовірність зіткнення в 10%.

Зрештою, мабуть, відбудеться зіткнення між набором UUID, що генеруються протягом людської історії. Проте ймовірність того, що зіткнулися UUID будуть використані з тією ж метою, є маловимірно малою, тому на практиці немає жодних проблем.


13
Ось так закінчується Всесвіт ... Деякі програміст просто припускає, що їхні GUID-файли завжди будуть унікальними для їхньої мега-зірки Death ...
pkr298,

Оскільки UUID засновані на невипадкових даних, 36 років - це вам потрібно турбуватися лише про кожну мілісекунду окремо.
міджард

@mjaggard UUID засновані на випадкових даних. Будь-який сучасний сорт, все одно.
Трежказ

8

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

Як зазначено у посиланні, на це впливатимуть властивості генератора випадкових чисел.

Існує також можливість помилки в коді генератора GUID; хоча шанси низькі, вони, ймовірно, вищі, ніж шанси на зіткнення, засновані на математиці.

Можливо, підійде фільтр Bloom; він може швидко визначити, чи GUID унікальний, але є ймовірність помилкового вказівки на зіткнення. Альтернативний метод, якщо ви тестуєте партію за раз, - це сортування партії та порівняння кожного наступного елемента.


5

Взагалі, так, це можна припустити.

Якщо ваш генератор GUID справді випадковий, можливості зіткнення в межах 1000 GUID надзвичайно малі.

Звичайно, це передбачає хороший генератор GUID. Отже, питання справді полягає в тому, наскільки ви довіряєте інструменту, який ви використовуєте для створення GUID, і чи є у нього свої тести?


0

Хоча зіткнення можливе, це ВИЩО малоймовірно. (Математика тут .) Можна впевнено припустити, що вони насправді є різними.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.