Потребан вам је идентификатор који се неће поклопити са неким који је направио неко други, на машини за коју никада нисте чули, без тражења дозволе од било кога? То је посао који обавља 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 комбинује временску ознаку са насумичним идентификатором чвора који има подешен бит за вишесмерно слање (multicast), тако да никада не носи адресу ваше мрежне картице као што су то чиниле првобитне имплементације из 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 када се користе као примарни кључ (primary key), и то није ствар укуса. Индекси базе података су B-стабла која се чувају у сортираном редоследу, и од тога где нови кључ слети у том редоследу зависи колико ће посла то уметање захтевати. Кључ v4 је насумичан, тако да узастопна уметања слећу у неповезане углове индекса: странице (page split) које су биле пуне се деле, делови стабла које база података држи у меморији ретко су они делови који су потребни за следеће уметање, а индекс на крају постаје већи и фрагментиранији него што то редови на које показује оправдавају. Кључ v7 почиње тренутном милисекундом, тако да узастопна уметања слећу једно поред другог на десну ивицу стабла, што је образац који производи ауто-инкрементирајући цео број и образац око којег су изграђене индексне структуре. У томе је цео компромис: v7 вам купује понашање приликом уметања секвенцијалног кључа, задржавајући својство због којег сте уопште изабрали UUID, а то је да свако може да га креира без питања сервера. То кошта само толико што је време креирања сада читљиво унутар идентификатора, а да ли је то уопште важно, питање је за ваше податке, а не за формат.
Никада ништа не проверава да ли је UUID јединствен; његова величина је његова гаранција. Нема регистра, нема слања захтева ка серверу, нема претраживања — генератор производи број и предаје га, а разлог зашто се два не поклопе је једноставно тај што постоји 2^122 могућих вредности за v4, око 5,3 секстилиона. Парадокс рођендана (birthday problem) је искрен начин да се то процени: требало би вам отприлике 2,7 трилиона идентификатора пре него што би постојала једнака шанса да се било која два поклопе, што значи милијарду нових UUID-јева сваке секунде током 86 година. Вреди бити прецизан о томе шта то обећава, а шта не. То је статистичка гаранција, а не аритметичка, и она важи само док је насумичност испод ње права — лоше иницијализован генератор (seed), или виртуелна машина клонирана заједно са својим базеном ентропије, разбија то на начин који сам формат не може да открије. Верзија 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-јеви се појављују свуда где нешто мора да буде именовано пре него што било шта може да потврди да је то име слободно. Апликацијски код их кује за редове које намерава да уметне, тако да објекат има идентитет пре него што уопште стигне до базе података, а клијент може да се позове на њега док је уписивање још у току. Дистрибуирани системи се још више ослањају на њих: неколико услуга које пишу у једну табелу, офлајн мобилни клијент који креира записе у авиону, ред чекања (queue) који мора да препозна поруку коју је већ обрадио — нико од њих не може да чека свој ред на заједничком бројачу. Верзија 5 покрива другачију потребу, а то је стабилан идентификатор изведен из нечега што већ имате: исти документ, исти URL или исти кориснички налог увек се мапирају у потпуно исти UUID, тако да се увоз може покренути два пута без дуплирања било чега. На другим местима, то је једноставно формат који систем захтева — идентификатор корелације који се провлачи кроз дневнике, име датотеке које се неће сударити када се отпремања хиљаду корисника нађу у једном фолдеру, кључ регистратора за Windows, тестни подаци који морају да изгледају као прави подаци.
Вреди знати неколико искрених ограничења. Једна серија је једна верзија: вредност наведена у пољу „Верзија“ важи за све у њој, тако да су покретање за v4 и покретање за v7 две серије. Ово је генератор, а не инспектор — лепљење UUID-ја да би се очитала његова верзија или његова временска ознака није нешто што ова страница ради. Дугме „Сачувај у датотеку“ пише обичну текстуалну датотеку, а не извоз у CSV или JSON. Верзија 7 отворено открива када је креирана, до у милисекунду, што је стварни компромис, а не мана, а верзија 1 пропушта време на исти начин; ако је то проблем за ваше податке, верзија 4 је верзија која ником ништа не говори. Две посебне вредности из стандарда нису верзије и стога нису опције у пољу „Верзија“, али их можете копирати одавде: нулти UUID (nil UUID), 00000000-0000-0000-0000-000000000000, и максимални UUID (max UUID), ffffffff-ffff-ffff-ffff-ffffffffffff. Све на овој страници прати стандард RFC 9562, спецификацију која је 2024. године заменила RFC 4122, тако да је излаз прихватљив за сваку библиотеку, базу података или API који уопште рукује са UUID-јевима. Унутар тих ограничења гаранција је јака: сваки идентификатор је изграђен по стандарду, од криптографски сигурне насумичности, на вашој сопственој машини, и нико други га никада не види.