Имате нужда от идентификатор, който няма да съвпадне с никой друг създаден от някого, на машина, за която никога не сте чували, без да е нужно да искате разрешение от когото и да било? Точно това е ролята на UUID. Това е 128-битово число, записано като 36 символа в познатия формат 8-4-4-4-12, и целият му дизайн е направен така, че никои две от тях няма да бъдат еднакви, дори когато нищо не координира кой кое получава. Този безплатен генератор ги създава във вашия браузър: изберете версия в полето Версия, посочете колко ви трябват в Брой и натиснете Генерирай. Страницата се отваря с един-единствен v4 — версията, която повечето проекти изискват, така че първият идентификатор е само на един клик разстояние.
Всеки идентификатор се изгражда от вашия браузър чрез Web Crypto API. Версия 4 използва crypto.randomUUID() там, където браузърът го предоставя, и crypto.getRandomValues() в останалите случаи — криптографски силен източник на случайност, а не псевдослучайна JavaScript функция като Math.random(). Версия 7 поставя 48-битов времеви маркер (в милисекунди) в началото, след това 12-битов брояч, който се увеличава в рамките на същата милисекунда, и накрая 62 случайни бита. Това е методът за подреждане, описан в RFC 9562; именно заради този брояч партида от хиляда броя излиза по ред, а не разбъркана. Версия 1 комбинира времевия маркер със случаен идентификатор на възела, в който е зададен мултикаст битът, така че никога не носи адреса на вашата мрежова карта, както правеха оригиналните реализации от 90-те години. Версии 3 и 5 изобщо не са случайни: те хешират пространство от имена заедно с име, използвайки съответно MD5 и SHA-1, и това хеширане също се случва на вашето устройство. Нищо не се изпраща към сървър, нищо не се записва в логове, а след като страницата зареди, генераторът продължава да работи дори и при изключена връзка.
Версия е полето, което определя всичко останало. Версия 4 се състои от 122 случайни бита и няма никаква структура — това е опцията по подразбиране и правилният отговор, когато даден идентификатор просто трябва да бъде уникален. Версия 7 запазва 62 случайни бита, но започва с времето, в което е създадена, така че набор от тях се сортира в реда на тяхното възникване; именно това я прави предпочитаната версия, когато идентификаторът ще стане ключ в база данни. Версия 1 е оригиналната схема, базирана на времето, запазена тук за системи, които все още я изискват. Версии 3 и 5 са особена двойка: те са детерминистични, което означава, че едни и същи входни данни винаги произвеждат един и същ идентификатор. Те изискват две допълнителни полета — Пространство от имена, което е едно от стандартните пространства DNS, URL, OID и X.500 или ваше Собствено пространство от имена (UUID), и Име — низът, който се идентифицира. Подайте на v5 пространството от имена URL и https://example.com/a, и ще получите същия UUID днес, утре и на чужда машина. Поради тази причина полето Брой изчезва, когато е избрана v3 или v5: хиляда копия на една детерминистична стойност биха били просто хиляда копия на една детерминистична стойност. За всяка друга версия Брой позволява стойности от 1 до 1000.
Четири превключвателя променят вида на резултата, без да променят 128-те бита отдолу. Главни букви отпечатва шестнадесетичните цифри в горен регистър, Без тирета дава компактната 32-символна форма, която някои колони и имена на файлове предпочитат, а Фигурни скоби обгръща стойността в { } — форматът, който Windows и светът на .NET наричат GUID. В Разширени опции, опцията urn:uuid: добавя префикса, който го прави официално URN; когато тя е включена, скобите и премахването на тиретата се изключват, защото стандартът позволява точно една URN форма и това е каноничната форма с тирета. Формат за копиране определя как се обединява партидата при копиране: по едно на ред, разделени със запетаи, или всяка стойност в кавички със запетая накрая, за директно поставяне в масив в код. Под резултата се намира ред, който показва случайността в битове — 122 за v4, 62 за v7 — и, за v7, времевия маркер, кодиран в първия идентификатор на партидата, така че времето вътре в стойността да е видимо, а не да се предполага. Както Копирай всичко, така и Запази във файл се съобразяват с полето Формат за копиране. История запазва последните ви 10 партиди в собствения ви браузър: кликнете върху някоя, за да я върнете, копирайте или изтрийте отделен запис, или изчистете целия списък. Изчисти изпразва резултата и не променя настройките ви, а след надвишаване на 50 идентификатора списъкът става един блок с превъртане вместо петдесет отделни реда.
Най-важното нещо на тази страница е разликата между v4 и v7 като първичен ключ (primary key) и това не е въпрос на вкус. Индексите в базите данни са дървета (например B-tree), които се поддържат сортирани, и мястото, където нов ключ попада в тази подредба, определя колко работа струва вмъкването. Ключът v4 е случаен, така че последователните вмъквания попадат в несвързани краища на индекса: страниците (pages), които са били пълни, се разцепват (page split), частите от дървото, които базата данни държи в паметта, рядко са тези, които ще трябват за следващото вмъкване, и в крайна сметка индексът става по-голям и по-фрагментиран, отколкото редовете, към които сочи, изискват. Ключът v7 започва с текущата милисекунда, така че последователните вмъквания попадат едно до друго в десния край на дървото — моделът, който създава автоматично нарастващо цяло число и около който са изградени структурите на индексите. Това е целият компромис: v7 ви дава поведението при вмъкване на последователен ключ, като същевременно запазва свойството, заради което сте избрали UUID на първо място, а именно, че всеки може да генерира такъв без да пита сървър. Цената за това е, че времето на създаване вече може да се прочете от идентификатора, и дали това има значение е въпрос, свързан с вашите данни, а не с формата.
Нищо никога не проверява UUID за уникалност; неговият размер е гаранцията. Няма регистър, няма запитване до сървър, няма търсене — генераторът създава число и го предава, а причината две от тях да не се сблъскат е просто, че има 2^122 възможни стойности за v4, около 5,3 ундецилиона. Парадоксът на рождения ден е най-честният начин за оценка на този мащаб: ще ви трябват приблизително 2,7 квинтилиона идентификатора, преди да има 50% шанс кои да е два от тях да съвпаднат, което означава един милиард нови UUID всяка секунда в продължение на 86 години. Струва си да бъдем точни какво това обещава и какво не. Това е статистическа гаранция, а не аритметична, и тя е валидна само докато случайността е истинска — лошо инициализиран генератор или виртуална машина, клонирана заедно с нейния ентропиен пул, я нарушават по начин, който форматът не може да открие. Версия 7 стеснява въпроса още повече: в рамките на една милисекунда един генератор изобщо не може да се повтори, защото броячът се увеличава, вместо да хвърля зарове, а при независими генератори 62-те случайни бита вършат работата.
UUID е идентификатор, а не парола. Версия 4 е непредсказуема и това изкушава хората да се отнасят към нея като към тайна — линк за нулиране на парола, непознаваем URL адрес, сесиен токен, API ключ. Непредсказуемостта е реална, но секретността е свойство на това как се борави с дадена стойност, а с идентификаторите по дизайн се борави невнимателно: те попадат в URL адреси, които остават в историята на браузъра, сървърните логове, заглавките referrer и анализите, и се поставят в съобщения в чатове. Останалите версии са още по-лоши кандидати. Версия 1 и версия 7 кодират момента на създаване, така че всеки, който притежава такъв, знае приблизително кога е създаден и може да стесни кръга на всичко, направено покрай него. Версии 3 и 5 са умишлено детерминистични: v5 UUID на имейл адрес не е хеширана тайна, това е стойност, която всеки със същия адрес може да изчисли за секунда. Използвайте UUID, за да именувате неща. Използвайте генератор на пароли или токен от библиотека, предназначена за тайни, когато стойността трябва да остане неизвестна.
Защо да изберете този генератор на UUID?
- Генериране само в браузъра: идентификаторите се създават на вашето устройство и никога не се изпращат никъде
- Случайност от Web Crypto API: криптографски сигурна, а не Math.random()
- Пет версии на едно място: v1, v3, v4, v5 и v7, без да сменяте инструменти
- Наистина подредена v7: брояч вътре в милисекундата, както е описано в RFC 9562
- Детерминистични v3 и v5 с четирите стандартни пространства от имена или ваше собствено
- До 1000 наведнъж, с компактен списък с превъртане след петдесет броя
- Всички често срещани формати: с тирета, без тирета, главни букви, във фигурни скоби или urn:uuid: URN
- Копиране като отделни редове, със запетаи или в кавички за директно поставяне в код
- Без ограничения и безплатно: без регистрация, без лимити за използване, нищо на нашите сървъри
UUID се появяват навсякъде, където нещо трябва да бъде именувано, преди някой да може да потвърди, че името е свободно. Кодът на приложението ги генерира за редове, които предстои да вмъкне, така че обектът има идентичност, още преди да е стигнал до базата данни, и клиентът може да се позовава на него, докато записът все още се изпълнява. Разпределените системи разчитат на тях още повече: няколко услуги, записващи в една таблица, мобилен клиент в офлайн режим, създаващ записи в самолет, опашка, която трябва да разпознае съобщение, което вече е обработила — нито едно от тях не може да чака реда си за споделен брояч. Версия 5 покрива различна нужда — това е стабилен идентификатор, извлечен от нещо, което вече имате: същият документ, същият URL адрес или същият акаунт винаги се съпоставя със същия UUID, така че един импорт може да се изпълни два пъти, без да дублира нищо. На други места те са просто форматът, който дадена система изисква — корелационен идентификатор в логове и трейсове (traces), име на файл, което няма да съвпадне, когато качвания от хиляда потребители попаднат в един бакет, ключ в системния регистър на Windows, или тестови данни, които трябва да изглеждат като истински.
Струва си да знаете няколко честни ограничения. Една партида е една версия: стойността в полето Версия се прилага за всичко в нея, така че генериране на v4 и генериране на v7 са две отделни партиди. Това е генератор, а не инспектор — поставянето на UUID, за да прочетете неговата версия или времеви маркер, не е нещо, което тази страница прави. Запази във файл записва обикновен текстов файл, а не CSV или JSON. Версия 7 открито разкрива кога е създадена, с точност до милисекунда, което е реален компромис, а не недостатък, и версия 1 разкрива времето по същия начин; ако това е проблем за вашите данни, версия 4 е версията, която не казва на никого нищо. Две специални стойности от стандарта не са версии и следователно не са опции във Версия, но можете да ги копирате от тук: nil UUID, 00000000-0000-0000-0000-000000000000, и max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Всичко на тази страница следва RFC 9562, спецификацията, която замени RFC 4122 през 2024 г., така че резултатът се приема от всяка библиотека, база данни или API, които изобщо работят с UUID. В рамките на тези ограничения гаранцията е много силна: всеки идентификатор е изграден според стандарта, от криптографски сигурна случайност, на вашата собствена машина, и никой друг никога не го вижда.