Чи GUID унікальний у 100% часу?
Чи залишиться він унікальним у кількох потоках?
Чи GUID унікальний у 100% часу?
Чи залишиться він унікальним у кількох потоках?
Відповіді:
Незважаючи на те, що кожен згенерований GUID не гарантовано є унікальним, загальна кількість унікальних ключів (2 128 або 3,4 × 10 38 ) настільки велика, що ймовірність створення одного і того ж числа вдвічі дуже мала. Наприклад, розглянемо спостережуваний Всесвіт, який містить близько 5 × 10 22 зірок; то кожна зірка могла мати 6,8 × 10 15 універсальних унікальних GUID.
З Вікіпедії .
Ось кілька хороших статей про те, як складається GUID (для .NET) і як ви могли отримати ту саму інструкцію в правильній ситуації.
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
Сігналы абмеркавання
2^128
виписано приблизно: 34,028,236,692,093,846,346,337,460,743,177,000,000
. Статистично, якщо ви розраховували 1000 GUID щосекунди, для отримання дублікату все одно знадобиться трильйони років.
Якщо ви боїтесь одних і тих же значень GUID, тоді покладіть два з них поруч.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Якщо ви занадто параноїк, тоді покладіть три.
999999999
у вашій формі, я думаю, що Параноїя згорне мій браузер.
Проста відповідь - так.
Реймонд Чен написав чудову статтю про GUID та чому підряди GUID не гарантуються унікальними. У статті йдеться про деяку глибину щодо того, як генеруються GUID, та даних, які вони використовують для забезпечення унікальності, які повинні пояснювати, чому вони такі :-)
В якості побічної записки я розігрувався з томами GUID в Windows XP. Це дуже незрозумілий макет розділів з трьома дисками та чотирнадцятьма томами.
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
| | | | |
| | | | +-- 6f = o
| | | +---- 69 = i
| | +------ 72 = r
| +-------- 61 = a
+---------- 6d = m
Справа не в тому, що GUID дуже схожі, а в тому, що всі GUID мають в них рядок "mario". Це збіг чи є пояснення за цим?
Тепер, коли googling для частини 4 в GUID, я виявив приблизно 125 000 звернень з томами GUID.
Висновок: Що стосується томів GUID, вони не такі унікальні, як інші GUID.
msiexec
, він перераховує всі MSI GUID програми офісу. Всі вони заклинають 0FF1CE
. Схоже, що Microsoft має досить ... нещільну ... інтерпретацію, як створити GUID;)
0FF1CE
GUID підпадають під розділ «Сумісність NCS назад» RFC-4122, але навряд чи Microsoft дотримується правил NCS для цих значень.
Це не повинно статися. Однак, коли .NET перебуває під великим навантаженням, можна отримати повторювані напрямні. У мене є два різних веб-серверів, що використовують два різних sql-сервери. Я пішов об’єднати дані і виявив, що маю 15 мільйонів путівників і 7 дублікатів.
Guid.NewGuid
завжди генерує v4 GUID (і завжди є). Тім, мабуть, мав надзвичайно бідні джерела ентропії.
Так, GUID завжди повинен бути унікальним. Він заснований на апаратному та часовому режимі, а також кілька додаткових біт, щоб переконатися, що він унікальний. Я впевнений, що теоретично можна одержати два однакових, але в реальному сценарії надзвичайно малоймовірно.
Ось чудова стаття Реймонда Чена про Guids:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Посібники статистично унікальні. Шанси двох різних клієнтів, що генерують один і той же Guid, нескінченно малі (якщо припускати помилки в коді, що генерує Guid). Ви можете також турбуватися про те, що ваш процесор виблискує через космічний промінь і вирішив, що сьогодні 2 + 2 = 5.
Кілька потоків, що виділяють нові напрямні, отримають унікальні значення, але ви повинні зрозуміти, що функція, яку ви викликаєте, є безпечною для потоків. У якому це середовищі?
Ерік Ліпперт написав дуже цікаву серію статей про GUID.
У світі є на замовлення 2 30 персональних комп’ютерів (і, звичайно, безліч портативних пристроїв або комп'ютерних пристроїв, що не мають ПК, які мають більш-менш однакові рівні обчислювальної потужності, але дозволяють їх ігнорувати). Припустимо, що ми ставимо перед усіма цими ПК у світі завдання створення GUID; якщо кожен може створити, скажімо, 2 20 GUID в секунду, то приблизно через 2 72 секунди - сто п’ятдесят трильйонів років - у вас буде дуже великий шанс створити зіткнення з вашим конкретним GUID. А шанси зіткнення виходять досить добрими лише через тридцять трильйонів років.
Теоретично ні, вони не унікальні. Можна генерувати ідентичні орієнтири знову і знову. Однак шанси на це трапляються настільки низькі, що ви можете припустити, що вони унікальні.
Раніше я читав, що шанси настільки низькі, що вам дійсно слід наголосити на чомусь іншому - наприклад, спонтанному спалюванні вашого сервера або інших помилках у вашому коді. Тобто припустімо, що він унікальний і не вбудовуйте жодного коду, щоб "ловити" дублікати - витрачайте свій час на щось більш ймовірне (тобто на що- небудь - інше).
Я зробив спробу описати корисність GUID для моєї аудиторії блогу (нетехнічні сімейні члени). Звідти (через Вікіпедію) шанси генерувати дублікат GUID:
Здається, жодна з них не згадує фактичну математику ймовірності її виникнення.
Спочатку припустимо, що ми можемо використовувати весь 128-бітний простір (Guid v4 використовує лише 122 біти).
Ми знаємо, що загальна ймовірність НЕ отримати дублікат у n
вибору:
(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )
Оскільки 2 128 набагато значно більше n
, ми можемо наблизити це до:
(1-1 / 2 128 ) n (n-1) / 2
І оскільки ми можемо вважати n
, що набагато більший за 0, ми можемо наблизити це до:
(1-1 / 2 128 ) п ^ 2/2
Тепер ми можемо прирівняти це до "прийнятної" ймовірності, скажімо, 1%:
(1-1 / 2 128 ) п ^ 2/2 = 0,01
Для чого ми вирішуємо n
і отримуємо:
n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))
Який Wolfram Alpha отримує 5,598318 × 10 19
Для того, щоб поставити цю цифру в перспективу, давайте взяти 10000 машин, кожен з яких має 4 ядра процесора, робить 4 ГГц і витрачає 10000 циклів, щоб створити керівництво і не робити нічого іншого. Потім вони пройдуть ~ 111 років, перш ніж вони генерують дублікат.
Від http://www.guidgenerator.com/online-guid-generator.aspx
Що таке GUID?
GUID (або UUID) - абревіатура для "глобально унікального ідентифікатора" (або "універсально унікального ідентифікатора"). Це 128-бітове ціле число, яке використовується для ідентифікації ресурсів. Термін GUID зазвичай використовується розробниками, що працюють з технологіями Microsoft, тоді як UUID використовується скрізь.
Наскільки унікальний GUID?
128-біт є достатньо великим, а алгоритм генерації є унікальним, що якщо генерувати 1 000 000 000 GUID в секунду за 1 рік, ймовірність дубліката складе лише 50%. Або якби кожен чоловік на Землі генерував 600 000 000 GUID, була б лише 50% -ва ймовірність дубліката.
У мене виник повторний GUID.
Я використовую сканер на робочих столах Neat Receipts, і він постачається з програмним забезпеченням для власних баз даних. Програмне забезпечення має функцію синхронізації з хмарою, і я продовжував отримувати помилку при синхронізації. Гандер біля журналів виявив дивовижну лінію:
"помилки": [{"код": 1, "повідомлення": "creator_guid: вже прийнято", "guide": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}
Я трохи не вірив, але, безумовно, досить, коли знайшов шлях до моєї локальної бази даних чистих мереж і видалив запис, що містить цей GUID, помилка перестала виникати.
Тож відповісти на ваше запитання анекдотичними доказами, ні. Дублікат можливий. Але ймовірно, що причина цього сталася не через випадковість, а через стандартну практику, яку якимось чином не дотримувався. (Мені просто не так пощастило) Однак я не можу сказати точно. Це не моє програмне забезпечення.
Їх підтримка клієнтів була НАДЗВИЧНО ввічливою і корисною, але вони, мабуть, ніколи раніше не стикалися з цим питанням, оскільки через 3 години, що спілкувалися з ними, вони не знайшли рішення. (FWIW, мене дуже вражає охайний, і цей глюк, як би не засмучував, не змінив мою думку про їхній продукт.)
MSDN :
Є дуже низька ймовірність того, що значення нового Guid дорівнює всім нулям або дорівнює будь-якому іншому Guid.
Якщо ваш системний годинник встановлений належним чином і не завернувся, і якщо ваш NIC має власний MAC (тобто ви не встановили спеціальний MAC), а ваш постачальник NIC не переробляє MAC (чого вони не повинні робити) але, як відомо, що відбувається), і якщо функція генерації GUID вашої системи належним чином реалізована, система ніколи не генеруватиме повторювані GUID.
Якщо всі на землі, які генерують GUID, дотримуються цих правил, то ваші GUID будуть унікальними у всьому світі.
На практиці кількість людей, які порушують правила, є низькою, і їх GUID навряд чи "втечуть". Конфлікти статистично малоймовірні.
Чи GUID унікальний у 100% часу?
Не гарантується, оскільки існує декілька способів їх отримання. Однак ви можете спробувати обчислити шанс створення двох ідентичних GUID, і ви отримаєте ідею: GUID має 128 біт, отже, є 2 128 різних GUID - багато більше, ніж зірок у відомому Всесвіті. Прочитайте статтю wikipedia для більш детальної інформації.
У більш загальному розумінні це відоме як "проблема дня народження" або "парадокс від дня народження". У Вікіпедії досить хороший огляд за адресою: Вікіпедія - проблема з днем народження
Якщо говорити дуже грубо, квадратний корінь розміру пулу є приблизним наближенням того, коли ви можете очікувати 50% шансу на копію. Стаття включає таблицю ймовірностей розміру пулу та різних ймовірностей, включаючи рядок для 2 ^ 128. Тож для 1% -ної ймовірності зіткнення ви розраховуєте випадковим чином вибрати 2,6 * 10 ^ 18 128-бітних чисел. На 50% шансів потрібно 2,2 * 10 ^ 19 вибору, тоді як SQRT (2 ^ 128) - 1,8 * 10 ^ 19.
Звичайно, це просто ідеальний випадок справді випадкового процесу. Як згадували інші, багато що їде на тому випадковому аспекті - наскільки хороший генератор і насіння? Було б добре, якби була якась апаратна підтримка, яка допомогла б у цьому процесі, яка була б більш захищеною від куль, за винятком того, що все можна підробити або віртуолізувати. Я підозрюю, що це може бути причиною того, що MAC-адреси / часові позначки більше не включаються.
Для отримання кращого результату найкращим способом є додавання GUID до часової позначки (Просто для того, щоб він залишався унікальним)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
Алгоритми GUID зазвичай реалізуються відповідно до специфікації GUID v4, яка по суті є псевдовипадковою рядком. На жаль, вони потрапляють до категорії "ймовірно не унікальних" з Вікіпедії (я не знаю, чому так багато людей ігнорує цей біт): "... інші версії GUID мають різні унікальні властивості та ймовірності, починаючи від гарантованої унікальності. до ймовірності не унікальності ".
Math.random()
Псевдовипадкові властивості JavaScript V8 є ГОЛОВНЕМИ в унікальності, зіткнення часто виникають після декількох тисяч ітерацій, але V8 не єдиний винуватець. Я бачив зіткнення GUID у реальному світі, використовуючи як PHP, так і Ruby реалізацію GU4 v4.
Оскільки це стає все більш поширеним для масштабування генерації ідентифікаторів для декількох клієнтів та кластерів серверів, ентропія сприймає великий удар - шанси того ж випадкового насіння використовувати для отримання ескалації ідентифікатора (час часто використовується як випадкове насіння у псевдовипадкових генераторах), а зіткнення GUID переходять від "ймовірно не унікального" до "дуже ймовірно, що спричинить багато проблем".
Щоб вирішити цю проблему, я поставив собі за мету створити алгоритм ідентифікатора, який міг би безпечно масштабуватись, і забезпечувати кращі гарантії проти зіткнення. Це робиться за допомогою позначки часу, лічильника в пам'яті клієнта, відбитків пальців клієнта та випадкових символів. Поєднання факторів створює додаткову складність, яка є особливо стійкою до зіткнень, навіть якщо ви масштабуєте її на кількох хостах:
Я переконався, що GUID не є унікальним під час тестування багатопотокових / багатопроцесових модулів (теж?). Я думаю, що це має відношення до того, що всі інші відтінки рівні, однаковий посів (або відсутність висіву) псевдовипадкових генераторів. Я використовував це для створення унікальних імен файлів. Я знайшов ОС набагато краще в цьому :)
Ви запитуєте, чи GUID є унікальними на 100%. Це залежить від кількості GUID, серед яких він повинен бути унікальним. Оскільки кількість GUID наближається до нескінченності, ймовірність дублювання GUID наближається до 100%.
Відповідь "Чи GUID на 100% унікальний?" просто "Ні" .
Якщо ви хочете 100% унікальності GUID, виконайте наступне.
Найважча частина полягає не в створенні дублюється Посібника.
Найважча частина - розроблена база даних для зберігання всіх створених, щоб перевірити, чи вона насправді дублюється.
Від WIKI:
Наприклад, кількість випадкових UUID версій 4, які необхідно генерувати, щоб мати 50% вірогідність принаймні одного зіткнення, становить 2,71 квінтільйона, обчислюється таким чином:
Це число еквівалентно генеруванню 1 мільярда UUID в секунду протягом приблизно 85 років, а файл, що містить це багато UUID, у 16 байт на UUID, буде приблизно 45 екбабайтів, у багато разів більший, ніж найбільші бази даних, що існують зараз порядку сотень петабайт
GUID означає глобальний унікальний ідентифікатор
Якщо коротко: (підказка в назві)
Детально: GUID призначені для унікального використання; вони розраховуються випадковим методом, заснованим на годиннику комп'ютера та на самому комп’ютері, якщо ви створюєте багато GUID на одній мілісекунді на одній машині, можливо, вони можуть відповідати, але майже для всіх звичайних операцій їх слід вважати унікальними.