Дали ви е потребен идентификатор кој нема да се совпадне со оној што некој друг го направил, на машина за која никогаш не сте слушнале, без да прашате некого за дозвола? Токму тоа го прави 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 комбинира временски печат со случаен идентификатор на јазол кај кој битот за мултикаст е поставен, па никогаш не ја содржи адресата на вашата мрежна картичка како што правеа оригиналните имплементации од 1990-тите. Верзиите 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 како примарен клуч, и тоа не е прашање на вкус. Индексите во базите на податоци се дрвја кои се одржуваат во подреден редослед, и местото каде што новиот клуч паѓа во тој редослед одредува колку работа чини вметнувањето. Клучот v4 е случаен, па последователните вметнувања паѓаат во неповрзани агли на индексот: страниците што биле полни се делат, деловите од дрвото кои базата ги држи во меморија ретко се оние кои му требаат на следното вметнување, а индексот на крајот станува поголем и пофрагментиран отколку што оправдуваат редовите кон кои покажува. Клучот v7 започнува со тековната милисекунда, па последователните вметнувања паѓаат едно до друго на десниот раб од дрвото, што е шемата која ја произведува авто-инкрементирачки цел број и шемата околу која се изградени структурите на индексите. Целиот компромис е во тоа: v7 ви го дава однесувањето при вметнување на секвенцијален клуч, притоа задржувајќи го својството поради кое воопшто сте избрале UUID, а тоа е дека секој може да генерира таков клуч без да праша сервер. Она што чини е фактот дека времето на креирање сега е читливо внатре во идентификаторот, а дали тоа е важно е прашање за вашите податоци, а не за форматот.
Ништо никогаш не проверува дали UUID е единствен; неговата големина е гаранцијата. Нема регистар, нема патување до сервер и назад, нема пребарување — генераторот произведува број и го предава, а причината зошто два од нив не доаѓаат во колизија е едноставно тоа што постојат 2^122 можни v4 вредности, околу 5,3 секстилиони. Парадоксот на роденденот е искрениот начин да се димензионира тоа: би ви биле потребни приближно 2,7 трилиони идентификатори пред да има дури 50-отстотна шанса било кои два од нив да се совпаднат, што е еднакво на милијарда нови UUID секоја секунда во текот на 86 години. Вреди да се биде прецизен за тоа што ова ветува, а што не. Тоа е статистичка гаранција, а не аритметичка, и важи само додека случајноста под неа е вистинска — лошо иницијализиран генератор, или виртуелна машина клонирана заедно со нејзиниот фонд на ентропија, ја кршат на начин кој форматот не може да го открие. Верзијата 7 го стеснува прашањето уште повеќе: внатре во една милисекунда еден генератор воопшто не може да се повтори, бидејќи бројачот се зголемува наместо да фрла коцка, а низ независни генератори 62-те случајни бита ја вршат работата.
UUID е идентификатор, а не лозинка. Верзијата 4 е непредвидлива, и тоа ги доведува луѓето во искушение да ја третираат како тајна — линк за ресетирање лозинка, URL што не може да се погоди, токен за сесија, API клуч. Непредвидливоста е реална, но тајноста е својство на тоа како се ракува со вредноста, а со идентификаторите се ракува невнимателно според самиот нивен дизајн: тие седат во URL-адреси, кои завршуваат во историјата на прелистувачите, логовите на серверите, реферер-хедерите и аналитиката, и се лепат во пораки. Останатите верзии се уште полоши кандидати. И верзијата 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, така што импортот може да се изврши двапати без ништо да се дуплира. На други места тие едноставно се форматот кој системот го бара — идентификатор за корелација провлечен низ логови и траги, име на датотека што нема да направи колизија кога аплоадирањата од илјада корисници ќе завршат во еден бакет, 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. Во рамките на тие граници гаранцијата е силна: секој идентификатор е изграден според стандардот, од криптографски сигурна случајност, на вашата сопствена машина, и никој друг никогаш нема да го види.