Патрэбен ідэнтыфікатар, які не будзе канфліктаваць ні з адным створаным кімсьці іншым, на машыне, пра якую вы ніколі не чулі, без неабходнасці прасіць у каго-небудзь дазволу? Гэта менавіта тая задача, якую выконвае 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 у якасці першаснага ключа (primary key), і гэта не пытанне густу. Індэксы базы даных уяўляюць сабой дрэвы (напрыклад, B-tree), якія падтрымліваюцца ў адсартаваным выглядзе, і тое, куды трапляе новы ключ у гэтым парадку, вызначае, колькі працы патрабуе ўстаўка. Ключ v4 з'яўляецца выпадковым, таму паслядоўныя ўстаўкі трапляюць у незвязаныя куткі індэкса: старонкі (pages), якія былі поўнымі, расшчапляюцца (page split), часткі дрэва, якія база даных трымае ў памяці, рэдка супадаюць з тымі, якія спатрэбяцца для наступнай устаўкі, і ў выніку індэкс становіцца большым і больш фрагментаваным, чым таго вартыя радкі, на якія ён паказвае. Ключ v7 пачынаецца з бягучай мілісекунды, таму паслядоўныя ўстаўкі трапляюць побач адна з адной на правым краі дрэва, што адпавядае шаблону аўтаінкрыментнага цэлага ліку, вакол якога і будаваліся структуры індэксаў. У гэтым і заключаецца кампраміс: v7 дае вам паводзіны ўстаўкі паслядоўнага ключа, захоўваючы пры гэтым ўласцівасць, з-за якой вы і выбралі UUID, а менавіта тое, што кожны можа стварыць яго без звароту да сервера. За гэта даводзіцца плаціць тым, што час стварэння цяпер можна прачытаць знутры ідэнтыфікатара, і ці мае гэта значэнне — гэта пытанне пра вашы даныя, а не пра фармат.
Нішто ніколі не правярае UUID на ўнікальнасць; яго памер — і ёсць гарантыя. Няма ніякага рэестра, звароту да сервера, пошуку — генератар стварае лік і аддае яго, а прычына, па якой два з іх не сутыкаюцца, заключаецца проста ў тым, што існуе 2^122 магчымых значэнняў v4, гэта каля 5,3 ундэцыльёна. Парадокс дня нараджэння — самы сумленны спосаб ацаніць гэты памер: вам спатрэбілася б каля 2,7 квінтыльёна ідэнтыфікатараў, перш чым з'явіцца роўная імавернасць таго, што якія-небудзь два з іх супадуць, што азначае адзін мільярд новых 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 з чатырма standardнымі прасторамі імёнаў або з вашай уласнай
- Да 1000 адначасова, з кампактным спісам з пракруткай пасля пяцідзесяці штук
- Усе распаўсюджаныя фарматы: са злучкамі, без іх, вялікія літары, у фігурных дужках або URN у фармаце urn:uuid:
- Капіяванне асобнымі радкамі, праз коску або ў двукоссі для ўстаўкі непасрэдна ў код
- Без абмежаванняў і бясплатна: без рэгістрацыі, без лімітаў выкарыстання, нічога на нашых серверах
UUID з'яўляюцца ўсюды, дзе трэба нешта назваць, перш чым хтосьці пацвердзіць, што імя свабоднае. Код праграмы стварае іх для радкоў, якія ён збіраецца ўставіць, каб аб'ект меў ідэнтычнасць яшчэ да таго, як дасягне базы даных, а кліент мог спасылацца на яго, пакуль запіс яшчэ выконваецца. Размеркаваныя сістэмы абапіраюцца на іх яшчэ больш: некалькі сэрвісаў, якія пішуць у адну табліцу, мабільны кліент у аўтаномным рэжыме, што стварае запісы ў самалёце, чарга, якая павінна пазнаць паведамленне, якое яна ўжо апрацавала — нішто з гэтага не можа чакаць сваёй чаргі да агульнага лічыльніка. Версія 5 задавальняе іншую патрэбу — гэта стабільны ідэнтыфікатар, атрыманы з таго, што вы ўжо маеце: той жа дакумент, той жа URL або той жа акаўнт заўсёды супастаўляецца з тым жа UUID, таму імпарт можна запускаць двойчы без дублявання даных. У іншых выпадках яны проста з'яўляюцца фарматам, які патрабуе сістэма — ідэнтыфікатар карэляцыі ў логах і трэйсах, імя файла, якое не будзе канфліктаваць, калі загрузкі ад тысячы карыстальнікаў трапяць у адзін бакет, ключ рэестра Windows, ці тэставыя даныя (fixtures), якія павінны выглядаць як сапраўдныя.
Варта ведаць некалькі сумленных абмежаванняў. Адна партыя — гэта адна версія: значэнне ў полі Версія прымяняецца да ўсяго ў партыі, таму запуск 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. У межах гэтых абмежаванняў гарантыя вельмі надзейная: кожны ідэнтыфікатар ствараецца па стандарце, з крыптаграфічна бяспечнай выпадковасці, на вашай уласнай машыне, і ніхто іншы ніколі яго не бачыць.