Я написав генератор / аналізатор UUID для Ruby, тому вважаю себе досить добре поінформованим з цього приводу. Існує чотири основні версії UUID:
UUID версії 4 - це лише 16 байт випадковості, витягнутий з криптографічно захищеного генератора випадкових чисел, з деяким подвійним змітанням для ідентифікації версії та варіанта UUID. Вони вкрай навряд чи зіткнуться, але це може статися, якщо використовується ПРНГ або якщо у вас просто трапиться справді, справді, справді, справді, дуже невдача.
Версії 5 та версії 3 UUID використовують хеш-функції SHA1 та MD5 відповідно, щоб об'єднати простір імен з частиною вже унікальних даних для генерації UUID. Наприклад, це дозволить створити UUID з URL-адреси. Зіткнення тут можливі лише в тому випадку, якщо основна хеш-функція також має зіткнення.
UUID версії 1 є найбільш поширеними. Вони використовують MAC-адресу мережевої картки (яка, за винятком випадків, коли вона підроблена, повинна бути унікальною), плюс часову позначку, плюс звичайне подвійне подвійне створення для UUID. У випадку з машиною, яка не має MAC-адреси, 6 байтів вузлів генеруються за допомогою криптографічно захищеного генератора випадкових чисел. Якщо два UUID генеруються в послідовності досить швидко, що часова марка відповідає попередній UUID, часова марка збільшується на 1. Зіткнення не повинно відбуватися, якщо не трапиться одне з наступних дій: MAC-адреса підроблена; Одна машина з двома різними програмами, що генерує UUID, виробляє UUID в той самий момент; Дві машини без мережевої карти або без доступу користувача на MAC-адресу отримують однакову послідовність випадкових вузлів і генерують UUID в той самий момент;
Реально, жодна з цих подій не відбувається випадково в просторі ідентифікатора однієї програми. Якщо ви не приймаєте посвідчення особи, скажімо, в масштабах Інтернету чи в ненадійному оточенні, де зловмисники можуть зробити щось погане у випадку зіткнення ідентифікатора, це просто не те, про що ви повинні турбуватися. Важливо розуміти, що якщо вам трапляється генерувати той самий UUID версії 4, що і я, в більшості випадків це не має значення. Я створив ідентифікатор у абсолютно іншому просторі ідентифікаторів від вашого. Моя програма ніколи не дізнається про зіткнення, тому зіткнення не має значення. Відверто кажучи, в єдиному просторі застосування без шкідливих акторів вимирання всього життя на Землі відбудеться задовго до того, як у вас відбудеться зіткнення, навіть у версії 4 UUID, навіть якщо ви '
Також 2 ^ 64 * 16 - 256 екбабайтів. Як і в, вам потрібно буде зберігати ідентифікатори на суму 256 екзабайтів, перш ніж у вас виникне 50% шанс зіткнення ідентифікатора в одному просторі програми.