Генератар UUID

Генеруйце UUID у браўзеры: выпадковыя v4, упарадкаваныя v7 для баз даных або дэтэрмінаваныя v5. Да 1000 адначасова, даныя ніколі не пакідаюць вашу прыладу.

Націсніце «Згенераваць» для выбару
Версія
Дадатковыя налады

Патрэбен ідэнтыфікатар, які не будзе канфліктаваць ні з адным створаным кімсьці іншым, на машыне, пра якую вы ніколі не чулі, без неабходнасці прасіць у каго-небудзь дазволу? Гэта менавіта тая задача, якую выконвае 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?

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. У межах гэтых абмежаванняў гарантыя вельмі надзейная: кожны ідэнтыфікатар ствараецца па стандарце, з крыптаграфічна бяспечнай выпадковасці, на вашай уласнай машыне, і ніхто іншы ніколі яго не бачыць.

FAQ

Як згенераваць UUID?

Выберыце версію ў полі Версія, усталюйце неабходную колькасць у полі Колькасць і націсніце Згенераваць. Старонка адкрываецца з адным ідэнтыфікатарам версіі 4, які патрабуецца для большасці праектаў, таму звычайны UUID даступны ў адзін клік. Кожнае значэнне мае ўласную кнопку капіявання, а Капіяваць усё бярэ ўсю партыю адразу.

У чым розніца паміж UUID v4 і v7?

Версія 4 — гэта 122 выпадковыя біты без ніякай структуры, таму два з іх не маюць ніякіх адносін адзін да аднаго. Версія 7 марнуе першыя 48 бітаў на мілісекунду, калі была створана, дадае лічыльнік і 62 выпадковыя біты, і таму паддаецца сартаванню: партыя выходзіць у тым парадку, у якім была створана. Выкарыстоўвайце v4, калі ідэнтыфікатар павінен быць толькі ўнікальным, і v7, калі ён таксама будзе ключом базы даных.

Якую версію UUID я павінен выкарыстоўваць?

Версію 4, калі ў вас няма прычын выбраць іншую. Выбірайце версію 7, калі ідэнтыфікатар становіцца першасным ключом (primary key) і прадукцыйнасць устаўкі мае значэнне, версію 5, калі вам трэба, каб аднолькавыя ўваходныя даныя заўсёды стваралі адзін і той жа ідэнтыфікатар, і версію 1, толькі калі сістэма, з якой вы ўзаемадзейнічаеце, прама патрабуе гэтага. Версія 3 — гэта тая ж версія 5, толькі з MD5 замест SHA-1, і існуе яна для зваротнай сумяшчальнасці.

Ці сапраўды згенераваныя UUID выпадковыя і бяспечныя?

Выпадковасць з'яўляецца крыптаграфічна бяспечнай: яна паходзіць з Web Crypto API вашага браўзера, праз crypto.randomUUID() або crypto.getRandomValues(), а не з Math.random(). Бяспека ў сэнсе непрадказальнасці — гэта іншае пытанне, чым бяспека ў сэнсе сакрэтнасці: UUID — гэта ідэнтыфікатар, і яго нельга выкарыстоўваць у якасці пароля, токена сесіі або ключа API.

Ці магу я згенераваць шмат UUID адначасова?

Так, да 1000 за адзін раз. Усталюйце Колькасць і націсніце Згенераваць; пры больш чым пяцідзесяці значэннях вынік ператвараецца ў адзін блок з пракруткай замест доўгага спісу радкоў. Капіяваць усё і Захаваць у файл бяруць ўсю партыю, аб'яднаную так, як пазначана ў опцыі Фармат капіявання — па адным у радку, праз коску або ў двукоссі для ўстаўкі ў масіў.

Чаму v3 і v5 кожны раз даюць мне аднолькавы UUID?

Таму што менавіта для гэтага яны прызначаны. Версіі 3 і 5 дэтэрмінаваныя: яны хэшуюць прастору імёнаў і імя, якія вы ім даяце, таму ідэнтычныя ўваходныя даныя заўсёды даюць ідэнтычны ідэнтыфікатар на любой машыне і на любой мове. Гэта робіць іх карыснымі для атрымання стабільнага ідэнтыфікатара з таго, што вы ўжо маеце, і менавіта таму поле Колькасць хаваецца пры іх выбары.

Што такое Прастора імёнаў і Імя, і якую прастору мне выбраць?

Гэта два ўваходныя параметры, з якіх вылічваецца UUID версіі 3 або 5. Прастора імёнаў паказвае, да якога тыпу належыць імя: DNS для імёнаў хастоў, URL для адрасоў, OID і X.500 для адпаведных схем каталогаў, або Свая прастора імёнаў (UUID), калі вы хочаце даць уласны UUID прасторы, што з'яўляецца звычайным выбарам унутры праграмы. Імя — гэта сам радок. Розныя прасторы імёнаў даюць абсалютна розныя вынікі для аднаго і таго ж імя, у гэтым і заключаецца іх сутнасць.

Чаму UUID v7 лепш за v4 у якасці першаснага ключа базы даных?

З-за таго, куды значэнні трапляюць у індэксе. Індэкс падтрымліваецца ў адсартаваным выглядзе, і выпадковы ключ v4 трапляе ў яго куды заўгодна, таму ўстаўкі расшчапляюць старонкі па ўсім дрэве, і часткі, якія захоўваюцца ў памяці, рэдка супадаюць з тымі, што спатрэбяцца наступнымі. Ключ v7 пачынаецца з бягучай мілісекунды, таму паслядоўныя ўстаўкі трапляюць разам у канец індэкса, што адпавядае паводзінам паслядоўнага цэлага ключа — пры гэтым дазваляючы любому сэрвісу ствараць ідэнтыфікатары без звароту да цэнтральнага лічыльніка.

Ці могуць калі-небудзь супасці два UUID?

У тэорыі так, на практыцы не, і варта ведаць, чаму. Нішто не правярае ўнікальнасць: існуе проста 2^122 магчымых значэнняў версіі 4 (каля 5,3 ундэцыльёна), і вам спатрэбілася б каля 2,7 квінтыльёна ідэнтыфікатараў — па мільярду ў секунду на працягу 86 гадоў — перш чым імавернасць хоць бы аднаго супадзення дасягнула б 50%. Гарантыя статыстычная, а не абсалютная, і яна залежыць ад сапраўднасці выпадковасці; вось чаму гэты генератар выкарыстоўвае Web Crypto API, а не звычайную псеўдавыпадковую функцыю.

Ці магу я выкарыстоўваць UUID у якасці пароля, ключа API або токена сесіі?

Не, і гэта памылка, якая абыходзіцца даражэй за ўсё. UUID версіі 4 непрадказальны, але з ідэнтыфікатарамі абыходзяцца так, нібыта яны агульнадаступныя: яны трапляюць у URL-адрасы, гісторыю браўзера, логі сервера, загалоўкі referrer і аналітыку. Версіі 1 і 7 дадаткова раскрываюць, калі яны былі створаны, а версіі 3 і 5 можа пералічыць любы, хто ведае ўваходныя даныя. Для ўсяго, што павінна заставацца сакрэтным, выкарыстоўвайце генератар пароляў або токен з бібліятэкі, прызначанай для сакрэтаў.

Ці раскрывае UUID v7 калі ён быў створаны?

Так, з дакладнасцю да мілісекунды, і гэта зроблена спецыяльна, а не праз недагляд — пазнака часу і ёсць тое, што робіць v7 сартаваным. Радок пад вынікам паказвае час, закадаваны ў першым значэнні партыі, каб вы маглі дакладна бачыць, што раскрываецца. Версія 1 таксама нясе пазнаку часу. Калі час стварэння — гэта тое, што вы не хацелі б публікаваць, то версія 4 увогуле не змяшчае ніякага часу.

Ці раскрывае UUID v1 мой MAC-адрас?

Не на гэтай старонцы. Арыгінальная схема выкарыстоўвала адрас сеткавай карты машыны ў якасці поля вузла, адкуль і паходзіць рэпутацыя v1, але стандарт таксама дапускае выпадковы ідэнтыфікатар вузла, пазначаны бітам мультыкасту, і менавіта такі стварае гэты генератар. Ваш апаратны адрас ніколі не чытаецца і ніколі не з'яўляецца ў выніку.

Што змяняюць налады Вялікія літары, Без злучкоў, Фігурныя дужкі і urn:uuid:?

Толькі вонкавы выгляд — 128 бітаў пад ім ідэнтычныя ў любой форме. Вялікія літары друкуе шаснаццатковыя лічбы загалоўнымі, Без злучкоў дае кампактную 32-знакавую версію, Фігурныя дужкі ахінае значэнне ў { } (як Windows і .NET пішуць GUID), а urn:uuid: дадае прэфікс, які робіць яго фармальным URN. Калі ўключаны urn:uuid:, ён адключае дзве іншыя налады, таму што стандарт вызначае роўна адну форму URN, і гэта кананічная форма са злучкамі.