Je, unahitaji kitambulisho (identifier) ambacho hakitagongana na kingine ambacho mtu mwingine ametengeneza, kwenye mashine ambayo hujawahi kuisikia, bila kuomba ruhusa kwa yeyote? Hiyo ndiyo kazi ambayo UUID hufanya. Ni nambari ya biti 128 (128-bit), inayoandikwa kama herufi 36 katika muundo unaofahamika wa 8-4-4-4-12, na muundo wake wote ni kwamba nambari mbili kati ya hizo hazitawahi kufanana hata kama hakuna kitu kinachoratibu nani anapata nini. Jenereta hii ya bure inazitengeneza kwenye kivinjari chako: chagua toleo kwenye 'Toleo', sema unahitaji ngapi kwenye 'Idadi', kisha ubonyeze 'Tengeneza'. Ukurasa huu unafunguka na v4 moja, toleo ambalo miradi mingi inahitaji, hivyo kitambulisho cha kwanza kinapatikana kwa mbofyo mmoja.
Kila kitambulisho hujengwa na kivinjari chako kupitia Web Crypto API. Toleo la 4 (v4) hutumia crypto.randomUUID() ambapo kivinjari kinatoa, na hutumia crypto.getRandomValues() vinginevyo — chanzo chenye nguvu za kificho cha usimbaji cha nambari za kubahatisha badala ya kipengele bandia cha kubahatisha cha JavaScript kama Math.random(). Toleo la 7 (v7) linaweka muhuri wa muda (timestamp) wa biti 48 wa milisekunde mbele, kisha kihesabu cha biti 12 kinachopanda ndani ya milisekunde hiyo hiyo, halafu biti 62 za kubahatisha, ambao ni utaratibu uliotajwa katika RFC 9562; kihesabu hicho ndicho sababu kundi la elfu moja hutoka kwa utaratibu badala ya kuchanganywa. Toleo la 1 (v1) huchanganya muhuri wa muda na kitambulisho cha nodi cha kubahatisha ambacho kina biti ya multicast ikiwa imewekwa, kwa hivyo hakibebei kamwe anwani ya kadi yako ya mtandao jinsi mifumo asilia ya miaka ya 1990 ilivyofanya. Matoleo ya 3 na 5 si ya kubahatisha hata kidogo: yanachanganya nafasi ya jina (namespace) pamoja na jina kuwa heshi (hash), yakitumia MD5 na SHA-1 mtawalia, na uheshiji huo pia hufanyika kwenye kifaa chako. Hakuna kinachotumwa kwenye seva, hakuna kinachohifadhiwa kwenye kumbukumbu (log), na mara tu ukurasa unapopakuliwa unaendelea kufanya kazi hata kama muunganisho umezimwa.
'Toleo' ndio sehemu inayoamua kila kitu kingine. Toleo la 4 lina biti 122 za kubahatisha na halina muundo wowote — hili ndilo chaguo msingi, na ndilo jibu sahihi wakati kitambulisho kinahitajika kuwa cha kipekee pekee. Toleo la 7 linabaki na biti 62 za kubahatisha lakini linaanza na muda lilipoundwa, kwa hivyo seti ya vitambulisho hivyo hupangwa kulingana na mpangilio wa muda vilipoundwa; hivyo ndivyo inavyoifanya kuwa toleo la kuchagua wakati kitambulisho kitakapokuwa ufunguo wa hifadhidata. Toleo la 1 ni mfumo asilia unaotegemea muda, ambao umewekwa hapa kwa mifumo ambayo bado inauulizia. Matoleo ya 3 na 5 ni jozi tofauti: yanategemea kuamuliwa (deterministic), ikimaanisha pembejeo (inputs) zilezile daima huzalisha kitambulisho kilekile, na huchukua sehemu mbili za ziada — 'Nafasi ya jina', ambayo ni moja wapo ya nafasi za kawaida kama DNS, URL, OID na X.500 au nafasi ya jina 'Maalum' ya kwako mwenyewe, na 'Jina', ambayo ni mfuatano wa herufi (string) unaotambuliwa. Ingiza v5 na nafasi ya jina ya URL na https://example.com/a na utapata UUID ileile leo, kesho na kwenye mashine ya mtu mwingine. Kwa sababu hiyo, 'Idadi' inatoweka wakati v3 au v5 imechaguliwa: nakala elfu moja za thamani moja inayoamulika (deterministic) itakuwa tu nakala elfu moja za thamani moja inayoamulika. Kwa kila toleo lingine, 'Idadi' inatoka 1 hadi 1000.
Swichi nne zinabadilisha umbo la matokeo bila kubadilisha biti 128 za msingi. 'Herufi kubwa' huchapisha tarakimu za heksadesimali kama herufi kubwa, 'Bila vistari' hutoa muundo ufupi wa herufi 32 ambao safu wima (columns) zingine na majina ya faili hupendelea, na 'Mabano' inafunga thamani kwenye { } — umbo ambalo Windows na ulimwengu wa .NET huiita GUID. Chini ya 'Chaguo za Kina', urn:uuid: inaongeza kiambishi awali (prefix) ambacho kinaifanya kuwa URN rasmi; inazima 'Mabano' na 'Bila vistari' ikiwa imewashwa, kwa sababu kiwango kinaruhusu muundo mmoja tu wa URN na ni ule wa kikanonika ulio na vistari (hyphens). 'Muundo wa kunakili' inaamua jinsi kundi linaunganishwa wakati unalichukua: moja kwa kila mstari, ikitenganishwa kwa koma, au kila thamani kwenye nukuu ikifuatiwa na koma, ambayo inaweza kubandikwa moja kwa moja kwenye orodha (array) katika msimbo (code). Chini ya matokeo kuna mstari unaoripoti ubahatishaji katika biti — 122 kwa v4, 62 kwa v7 — na, kwa v7, muhuri wa muda ulioingizwa kwenye kitambulisho cha kwanza cha kundi, hivyo muda uliomo ndani ya thamani unaonekana badala ya kudokezwa tu. 'Nakili Vyote' na 'Hifadhi kwenye faili' zote zinafuata 'Muundo wa kunakili'. 'Historia' huhifadhi makundi 10 ya mwisho kwenye kivinjari chako: bofya kundi moja ili kulirudisha, nakili au ufute ingizo moja, au ufute yote kabisa. Kitufe cha 'Futa' hutupa matokeo na huacha mipangilio yako kama ilivyo, na baada ya vitambulisho 50 orodha inakuwa kizuizi kimoja kinachoweza kusongeshwa (scrollable) badala ya mistari hamsini.
Jambo lenye matokeo zaidi kwenye ukurasa huu ni tofauti kati ya v4 na v7 kama ufunguo wa msingi (primary key), na hili si suala la kupenda tu. Faharasa za hifadhidata ni miti (B-trees) inayowekwa katika mpangilio, na pale ambapo ufunguo mpya unatua katika mpangilio huo inaamua kiasi cha kazi ambacho uingizaji (insert) utagharimu. Ufunguo wa v4 ni wa kubahatisha, hivyo uingizaji unaofuatana unatua katika pembe zisizohusiana za faharasa: kurasa (pages) zilizokuwa zimejaa hugawanyika, sehemu za mti ambazo hifadhidata inashikilia kwenye kumbukumbu mara chache ni sehemu zinazohitajika na uingizaji unaofuata, na faharasa hatimaye inakuwa kubwa zaidi na kugawanyika (fragmented) zaidi kuliko inavyostahili kwa safu (rows) inazoelekeza. Ufunguo wa v7 unaanza na milisekunde ya sasa, hivyo uingizaji unaofuatana unatua karibu na mwingine kwenye ukingo wa kulia wa mti, ambao ni mtindo ambao nambari (integer) inayojiongeza hutengeneza na mtindo ambao miundo ya faharasa ilijengwa kufuata. Huo ndio ubadilishanaji mzima: v7 inakupa tabia ya uingizaji wa ufunguo mfululizo huku ikihifadhi sifa iliyokufanya uchague UUID hapo mwanzo, ambayo ni kwamba mtu yeyote anaweza kutengeneza moja bila kuuliza seva. Kile inachogharimu ni kwamba muda wa kuumbwa sasa unaweza kusomeka ndani ya kitambulisho, na kama hilo lina umuhimu ni swali kuhusu data yako, sio kuhusu muundo.
Hakuna kinachowahi kukagua UUID ili kuhakikisha upekee wake; ukubwa wake ndiyo dhamana. Hakuna sajili, hakuna safari ya kwenda na kurudi kwenye seva, hakuna utafutaji — jenereta hutoa nambari na kuikabidhi, na sababu ya kwamba mbili kati yazo hazigongani (collide) ni kwa sababu tu kuna maadili (values) 2^122 yanayowezekana kwa v4, takriban 5.3 undecillion (5.3 × 10^36). Tatizo la siku ya kuzaliwa (birthday problem) ni njia ya uaminifu ya kupima ukubwa huo: unahitaji takriban vitambulisho 2.7 quintillion (2.7 × 10^18) kabla ya kuwa na nafasi ya 50% ya viwili vyao kufanana, ambazo ni UUID mpya bilioni moja kila sekunde kwa miaka 86. Inafaa kuwa sahihi kuhusu kile ahadi hii inachofanya na isichofanya. Ni dhamana ya kitakwimu (statistical), si ya kihesabu (arithmetic), na inashikilia tu wakati ubahatishaji ulio chini yake ni wa kweli — jenereta iliyopewa mbegu (seed) mbaya, au mashine pepe (virtual machine) iliyonakiliwa (cloned) pamoja na hifadhi yake ya entropia (entropy pool), itaivunja kwa njia ambayo muundo huo hauwezi kugundua. Toleo la 7 linapunguza swali hilo zaidi: ndani ya milisekunde moja jenereta haiwezi kujirudia yenyewe hata kidogo, kwa sababu kihesabu kinaongezeka (increments) badala ya kurusha kete, na kati ya jenereta zinazojitegemea biti 62 za kubahatisha hufanya kazi hiyo.
UUID ni kitambulisho, si nenosiri. Toleo la 4 halitabiriki, na hilo huwashawishi watu kulichukulia kama siri — kiungo cha kuweka upya nenosiri, URL isiyotabirika, tokeni ya kikao (session token), ufunguo wa API. Kutotabirika ni ukweli, lakini usiri ni tabia ya jinsi thamani inavyoshughulikiwa, na vitambulisho vinashughulikiwa kwa uzembe kwa makusudi: hukaa kwenye URLs, ambazo huishia kwenye historia ya kivinjari, logi za seva, vichwa vya virejeleaji (referrer headers) na takwimu (analytics), na hubandikwa kwenye jumbe za soga (chat). Matoleo mengine ni wagombea wabaya zaidi. Toleo la 1 na toleo la 7 yote yanashikilia muda wa kuumbwa, kwa hivyo mtu yeyote anayeshikilia moja anajua takriban ni lini ilitengenezwa na anaweza kupunguza wigo wa kila kitu kilichotengenezwa pamoja nayo. Matoleo ya 3 na 5 yanategemea kuamuliwa (deterministic) kwa makusudi: UUID ya v5 ya anwani ya barua pepe si siri iliyoheshishwa (hashed secret), ni thamani ambayo mtu yeyote aliye na anwani hiyohiyo anaweza kukokotoa kwa sekunde moja. Tumia UUID kutaja kitu. Tumia jenereta ya nenosiri, au tokeni kutoka kwa maktaba iliyoundwa kwa ajili ya siri, wakati thamani inapaswa kubaki bila kujulikana.
Kwa nini uchague jenereta hii ya UUID?
- Utengenezaji kwenye kivinjari pekee: vitambulisho vinatengenezwa kwenye kifaa chako na havitumwi popote
- Ubahatishaji wa Web Crypto API: salama kwa kificho cha usimbaji, si Math.random()
- Matoleo matano mahali pamoja: v1, v3, v4, v5 na v7, bila kubadilisha zana
- v7 iliyopangwa kwa mpangilio kikweli: kihesabu ndani ya milisekunde, kama RFC 9562 inavyoelezea
- v3 na v5 zinazoamulika (deterministic) zenye nafasi za majina (namespaces) nne za kawaida au yako mwenyewe
- Hadi 1000 kwa wakati mmoja, na orodha fupi inayoweza kusongeshwa baada ya hamsini
- Kila umbo la kawaida: yenye vistari, tupu, herufi kubwa, zenye mabano au urn:uuid: URN
- Nakili kama mistari, koma au maadili yaliyonukuliwa ambayo hubandikwa moja kwa moja kwenye msimbo (code)
- Bila kikomo na bure: hakuna kujiandikisha, hakuna ukomo wa matumizi, hakuna chochote kwenye seva zetu
UUIDs hujitokeza popote ambapo kitu kinapaswa kupewa jina kabla ya chochote kuthibitisha kuwa jina hilo liko wazi. Msimbo wa programu (application code) huzitengeneza kwa safu (rows) inazotarajia kuziingiza, kwa hivyo kitu hicho (object) kinakuwa na utambulisho kabla hata ya kufikia hifadhidata (database) na mteja (client) anaweza kukirejelea wakati uandishi ukiwa bado unaendelea. Mifumo iliyosambazwa (distributed systems) hutoa uzito zaidi kwa hili: huduma (services) kadhaa zinazoandika kwenye jedwali (table) moja, mteja wa simu wa nje ya mtandao anayetengeneza rekodi akiwa kwenye ndege, foleni (queue) ambayo inapaswa kutambua ujumbe ambao tayari imeushughulikia — hakuna kati ya haya inayoweza kusubiri zamu yake kwa kihesabu kinachoshirikiwa (shared counter). Toleo la 5 linakidhi hitaji tofauti, ambalo ni kitambulisho dhabiti kinachotokana na kitu unachokuwa nacho tayari: hati ileile, URL ileile au akaunti ileile daima huelekeza kwa UUID ileile, ili uagizaji (import) uweze kuendeshwa mara mbili bila kunakili (duplicating) chochote. Kwingineko zinatumika tu kama umbo ambalo mfumo unahitaji — kitambulisho cha uhusiano kinachopita kwenye logi na nyayo (traces), jina la faili ambalo halitagongana wakati vipakiwa (uploads) kutoka kwa watumiaji elfu moja vinatua kwenye ndoo (bucket) moja, ufunguo wa sajili wa Windows (Windows registry key), muundo wa jaribio (test fixture) ambao unapaswa kuonekana kama data halisi.
Ni vyema kufahamu mipaka michache ya kweli. Kundi (batch) moja ni toleo (version) moja: thamani iliyo kwenye 'Toleo' inatumika kwa kila kitu kilichomo ndani, kwa hivyo utekelezaji wa v4s na utekelezaji wa v7s ni makundi mawili. Hii ni jenereta, si mkaguzi — kubandika UUID hapa ili kusoma tena toleo lake au muhuri wake wa muda si kitu ambacho ukurasa huu hufanya. 'Hifadhi kwenye faili' inahifadhi faili ya maandishi matupu (plain text) badala ya CSV au JSON. Toleo la 7 linafichua wazi wakati lilipoundwa, hadi kwa milisekunde, ambalo ni ubadilishanaji wa kweli badala ya kasoro, na toleo la 1 linavujisha muda kwa njia hiyohiyo; ikiwa hilo ni tatizo kwa data yako, toleo la 4 ni toleo ambalo halimwambii mtu yeyote chochote. Maadili mawili maalum kutoka kwenye kiwango si matoleo na hivyo si chaguo kwenye 'Toleo', lakini unaweza kuyanakili kutoka hapa: UUID nil, 00000000-0000-0000-0000-000000000000, na UUID max, ffffffff-ffff-ffff-ffff-ffffffffffff. Kila kitu kwenye ukurasa huu kinafuata RFC 9562, uainishaji (specification) ambao ulichukua nafasi ya RFC 4122 mwaka 2024, kwa hivyo matokeo yanakubaliwa na maktaba, hifadhidata au API yoyote inayoshughulikia UUIDs. Ndani ya mipaka hiyo dhamana ni yenye nguvu: kila kitambulisho hujengwa kwa kiwango (standard), kutoka kwa ubahatishaji salama wa kificho cha usimbaji, kwenye mashine yako mwenyewe, na hakuna mtu mwingine anayewahi kukiona.