Басқа біреу жасаған, сіз ешқашан естімеген компьютердегі және ешкімнен рұқсат сұрауды қажет етпейтін, ешқашан қайталанбайтын идентификатор керек пе? Бұл дәл UUID атқаратын жұмыс. Ол таныс 8-4-4-4-12 үлгісіндегі 36 таңба ретінде жазылатын 128 биттік сан және оның бүкіл дизайны олардың екеуінің ешқашан бірдей болмауына негізделген — кімнің қайсысын алатынын ешнәрсе үйлестірмесе де. Бұл тегін генератор оларды браузеріңізде жасайды: «Нұсқа» өрісінен нұсқаны таңдаңыз, «Саны» өрісінде қанша қажет екенін көрсетіңіз де, «Жасау» түймесін басыңыз. Бет жобалардың көпшілігі сұрайтын бір v4 идентификаторымен ашылады, сондықтан бірінші идентификаторды алу үшін тек бір рет басу жеткілікті.
Әрбір идентификаторды браузеріңіз Web Crypto API арқылы жасайды. 4-нұсқа браузер қолдау көрсететін жерде crypto.randomUUID() функциясын, ал басқа жағдайда crypto.getRandomValues() функциясын пайдаланады — бұл Math.random() сияқты JavaScript жалған кездейсоқ функциясы емес, криптографиялық күшті кездейсоқтық көзі. 7-нұсқа алдына 48 биттік миллисекундтық уақыт белгісін, одан кейін сол миллисекунд ішінде өсетін 12 биттік есептегішті, содан кейін 62 кездейсоқ битті қояды — бұл RFC 9562 құжатында сипатталған реттеу әдісі; мыңдаған мәндердің араласып кетпей, рет-ретімен шығуы осы есептегіштің арқасы. 1-нұсқа уақыт белгісін мультикаст биті орнатылған кездейсоқ түйін идентификаторымен біріктіреді, сондықтан ол 1990 жылдардағы бастапқы енгізілімдер сияқты желілік картаңыздың мекенжайын ешқашан тасымалдамайды. 3 және 5-нұсқалар мүлдем кездейсоқ емес: олар есімдер кеңістігін (namespace) атаумен бірге сәйкесінше MD5 және SHA-1 арқылы хэштейді және бұл хэштеу процесі де сіздің құрылғыңызда орындалады. Серверге ештеңе жіберілмейді, ештеңе тіркелмейді және бет жүктелгеннен кейін ол интернет қосылымынсыз да жұмысын жалғастыра береді.
«Нұсқа» — қалғанның бәрін шешетін өріс. 4-нұсқа — 122 кездейсоқ бит және ешқандай құрылым жоқ — бұл әдепкі нұсқа және идентификатор тек бірегей болуы қажет болған кездегі дұрыс жауап. 7-нұсқа 62 кездейсоқ битті сақтайды, бірақ ол жасалған уақытпен басталады, сондықтан олардың жиынтығы жасалған уақыты бойынша сұрыпталады; егер идентификатор дерекқор кілті болатын болса, дәл осы нұсқаны таңдау керек. 1-нұсқа — бұл әлі де талап ететін жүйелер үшін осында сақталған бастапқы уақытқа негізделген схема. 3 және 5-нұсқалар — ерекше жұп: олар детерминистік, яғни бірдей енгізулер әрқашан бірдей идентификатор шығарады. Олар екі қосымша өрісті қажет етеді — стандартты кеңістіктердің бірі (DNS, URL, OID, X.500) немесе өзіңіз көрсеткен «Таңдамалы» бола алатын «Есімдер кеңістігі» және идентификацияланатын жол болып табылатын «Атауы». v5 нұсқасына URL есімдер кеңістігін және https://example.com/a мекенжайын беріңіз, сонда сіз бүгін де, ертең де, басқа біреудің компьютерінде де бірдей UUID аласыз. Осыған байланысты, v3 немесе v5 таңдалғанда «Саны» өрісі жоғалады: бір детерминистік мәннің мың көшірмесі бәрібір бір детерминистік мәннің мың көшірмесі болар еді. Қалған барлық нұсқалар үшін «Саны» 1-ден 1000-ға дейін болады.
Төрт қосқыш негізгі 128 битті өзгертпестен шығыс нәтижесінің пішімін өзгереді. «Бас әріптер» қосқышы оналтылық сандарды үлкен әріптермен басып шығарады, «Дефиссіз» кейбір бағандар мен файл атауларына қажетті ықшам 32 таңбалы пішімді береді, ал «Фигуралық жақшалар» мәнді { } ішіне алады — бұл пішімді Windows және .NET әлемі GUID деп атайды. «Кеңейтілген опциялар» бөліміндегі urn:uuid: оны ресми URN ететін префикс қосады; ол қосылып тұрғанда «Фигуралық жақшалар» және «Дефиссіз» опцияларын өшіреді, өйткені стандарт тек бір URN пішіміне рұқсат береді және ол дефистері бар канондық пішім. «Көшіру пішімі» көшірілген кезде жиынтықтың қалай біріктірілетінін анықтайды: әр жолда біреуден, үтірмен бөлінген, немесе массивке тікелей қоюға арналған әр мән тырнақша ішінде және соңында үтірмен. Нәтиженің астында кездейсоқтықты битпен көрсететін жол орналасқан — v4 үшін 122, v7 үшін 62 — және v7 үшін жиынтықтың бірінші идентификаторында кодталған уақыт белгісі көрсетіледі, осылайша мән ішіндегі уақыт жасырын емес, көрінетін болады. «Барлығын көшіру» және «Файлға сақтау» түймелері «Көшіру пішімі» параметрін ескереді. «Тарих» соңғы 10 жиынтығыңызды өз браузеріңізде сақтайды: оны қайтару үшін біреуін басыңыз, белгілі бір жазбаны көшіріңіз немесе жойыңыз, немесе барлығын тазалаңыз. «Тазалау» түймесі параметрлеріңізге тиіспей нәтижені тазалайды, ал 50 идентификатордан кейін тізім елу жолдың орнына айналдыруға болатын бір блокқа айналады.
Бұл беттегі ең маңызды нәрсе — бастапқы кілт (primary key) ретінде v4 пен v7 арасындағы айырмашылық және бұл талғам мәселесі емес. Дерекқор индекстері — сұрыпталған ретпен сақталатын ағаштар және жаңа кілттің осы ретпен қай жерге түсетіні оны енгізу қанша жұмысқа түсетінін шешеді. v4 кілті кездейсоқ, сондықтан тізбекті енгізулер индекстің бір-біріне байланыссыз бұрыштарына түседі: толық болған беттер бөлінеді, дерекқор жадында сақтайтын ағаш бөліктері сирек келесі енгізуге қажет бөліктер болады, ал индекс ондағы жолдарға қарағанда әлдеқайда үлкен және фрагменттелген болып шығады. v7 кілті ағымдағы миллисекундтан басталады, сондықтан тізбекті енгізулер ағаштың оң жақ шетінде бірге жиналады, бұл автоматты өсетін бүтін сан (auto-incrementing integer) жасайтын үлгі және индекс құрылымдары дәл осы үлгіге негізделіп құрылған. Бүкіл ымыра осында: v7 сізге кез келген қызметтің орталық есептегішсіз идентификатор жасай алу қасиетін (сіздің бастапқыда UUID-ді таңдауыңыздың себебі) сақтай отырып, тізбекті кілтті енгізу мінез-құлқын береді. Мұның құны — жасалу уақыты енді идентификатор ішінде оқылатын болады және оның маңызды не маңызды еместігі форматқа емес, сіздің деректеріңізге байланысты мәселе.
Ешқашан ешнәрсе UUID-ді бірегейлікке тексермейді; оның өлшемі кепілдік болып табылады. Ешқандай тізілім жоқ, серверге сұраныс жіберілмейді, іздеу жасалмайды — генератор санды жасайды да оны сізге береді, ал олардың екеуінің бір-біріне сәйкес келмеуінің себебі жай ғана 2^122 мүмкін болатын 4-нұсқа мәндерінің бар болуы, шамамен 5,3 × 10^36. Туған күн парадоксы мұны бағалаудың ең жақсы жолы: кез келген екеуінің сәйкес келу мүмкіндігі 50% болуы үшін сізге шамамен 2,7 × 10^18 идентификатор қажет болар еді — бұл 86 жыл бойы секундына бір миллиард жаңа UUID деген сөз. Бұл статистиканың нені уәде ететінін және нені етпейтінін нақты білу маңызды. Бұл арифметикалық емес, статистикалық кепілдік және ол оның негізіндегі кездейсоқтық шынайы болғанда ғана өз күшінде болады — нашар инициализацияланған генератор немесе энтропия пулымен бірге клондалған виртуалды машина оны формат байқай алмайтындай етіп бұзады. 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 сипаттағандай миллисекунд ішіндегі есептегіш
- 4 стандартты немесе өз есімдер кеңістігіңізбен детерминистік v3 және v5
- Елуден астам мән үшін жинақы айналдыру тізімімен бір уақытта 1000-ға дейін
- Барлық жалпы пішімдер: дефиспен, дефиссіз, бас әріптермен, жақшамен немесе urn:uuid: URN
- Тікелей кодқа қою үшін жолдар, үтірмен бөлінген немесе тырнақшаға алынған мәндер ретінде көшіру
- Шектеусіз және тегін: тіркелусіз, пайдалану шектеулерінсіз, серверлерімізде ештеңе сақталмайды
UUID-лер атаудың бос екенін ешкім растамас бұрын бір нәрсеге атау беру қажет болған кезде пайда болады. Қолданба коды оларды енгізгісі келетін қатарлар үшін жасайды, осылайша нысан дерекқорға жетпес бұрын идентификаторға ие болады және жазу әлі орындалып жатқанда клиент оған сілтеме жасай алады. Үлестірілген жүйелер оларға көбірек сүйенеді: бір кестеге жазатын бірнеше қызмет, ұшақта желіден тыс жазбалар жасайтын мобильді клиент, өзі өңдеп қойған хабарламаны тануы керек кезек — бұлардың ешқайсысы ортақ есептегішті күте алмайды. 5-нұсқа басқа қажеттілікті қамтиды, бұл сізде бар нәрседен алынған тұрақты идентификатор: бір құжат, бір URL немесе бір тіркелгі әрқашан бірдей UUID мәніне сәйкес келеді, сондықтан импортты ештеңені қайталамай екі рет орындауға болады. Басқа жерлерде олар жай ғана жүйе талап ететін пішім болып табылады — логтар мен трейстер арқылы өтетін корреляция идентификаторы, мыңдаған пайдаланушы жүктеп салған файлдар бір шелекке (bucket) түскенде қайталанбайтын файл атауы, Windows тізілімінің кілті, нақты деректер сияқты көрінуі қажет сынақ деректері.
Бірнеше шынайы шектеулерді білген жөн. Бір топтама — бұл бір нұсқа: «Нұсқа» өрісіндегі мән оның ішіндегі барлық нәрсеге қолданылады, сондықтан v4 және v7 тобы екі бөлек топтама болып табылады. Бұл инспектор емес, генератор — оның нұсқасын немесе уақыт белгісін оқу үшін UUID қою бұл беттің жұмысы емес. «Файлға сақтау» түймесі CSV немесе JSON емес, қарапайым мәтіндік файлды жазады. 7-нұсқа оның қашан жасалғанын миллисекундқа дейін ашық көрсетеді, бұл кемшілік емес, нақты ымыра, ал 1-нұсқа да уақытты дәл осылай көрсетеді; егер бұл сіздің деректеріңіз үшін проблема болса, 4-нұсқа — ешкімге ештеңе айтпайтын нұсқа. Стандарттағы екі арнайы мән нұсқа емес, сондықтан «Нұсқа» өрісінде таңдау ретінде ұсынылмайды, бірақ оларды осы жерден көшіріп алуға болады: nil UUID, 00000000-0000-0000-0000-000000000000 және max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Бұл беттегі барлық нәрсе 2024 жылы RFC 4122-ні алмастырған RFC 9562 спецификациясына сәйкес келеді, сондықтан нәтижені UUID-мен жұмыс істейтін кез келген кітапхана, дерекқор немесе API қабылдайды. Осы шектеулер аясында кепілдік күшті: әрбір идентификатор стандартқа сай, криптографиялық қауіпсіз кездейсоқтықтан, сіздің өз компьютеріңізде жасалады және оны басқа ешкім ешқашан көрмейді.