Jenereta ya UUID

Tengeneza UUIDs kwenye kivinjari: v4 za kubahatisha, v7 zenye mpangilio wa muda, au v5 inayoamulika. Hadi 1000 kwa mkupuo, data haitoki kwenye kifaa.

Bofya Tengeneza ili kuchagua
Toleo
Chaguo za Kina

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?

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.

FAQ

Ninawezaje kutengeneza UUID?

Chagua toleo kwenye 'Toleo', weka ni ngapi unazohitaji kwenye 'Idadi', kisha ubonyeze 'Tengeneza'. Ukurasa hufunguliwa kwa kitambulisho kimoja cha toleo la 4, ambacho ndicho miradi mingi inahitaji, kwa hivyo UUID ya kawaida inapatikana kwa mbofyo mmoja tu. Kila thamani huonekana ikiwa na kitufe chake cha kunakili, na 'Nakili Vyote' huchukua kundi zima kwa wakati mmoja.

Kuna tofauti gani kati ya UUID v4 na v7?

Toleo la 4 ni biti 122 za kubahatisha bila muundo wowote, kwa hivyo mbili zake hazina uhusiano wowote. Toleo la 7 hutumia biti 48 za kwanza kwa milisekunde ambayo liliundwa, kuongeza kihesabu (counter) na biti 62 za kubahatisha, na kwa hivyo linaweza kupangwa: kundi linatoka kwa utaratibu ambao lilitengenezwa. Tumia v4 wakati kitambulisho kinapaswa tu kuwa cha kipekee (unique), na v7 wakati pia kitakuwa ufunguo wa hifadhidata (database key).

Ninapaswa kutumia toleo gani la UUID?

Toleo la 4 isipokuwa una sababu ya kuchagua lingine. Chagua toleo la 7 ikiwa kitambulisho kitakuwa ufunguo wa msingi (primary key) na utendaji wa uingizaji (insert performance) unajali, toleo la 5 ikiwa unahitaji pembejeo (input) sawa daima kutoa kitambulisho kilekile, na toleo la 1 ikiwa tu mfumo ambao unapaswa kuwasiliana nao unaulizia haswa toleo hilo. Toleo la 3 ni toleo la 5 na MD5 badala ya SHA-1, na lipo kwa utangamano (compatibility).

Je, UUIDs zinazotengenezwa kweli ni za kubahatisha na salama?

Ubahatishaji ni salama kwa kificho cha usimbaji: unatokana na Web Crypto API ya kivinjari chako, kupitia crypto.randomUUID() au crypto.getRandomValues(), na siyo kutoka kwa Math.random(). Salama kwa maana ya kutotabirika ni swali tofauti na salama kwa maana ya usiri — UUID ni kitambulisho, na haipaswi kutumiwa kama nenosiri, tokeni ya kikao (session token) au ufunguo wa API.

Je, ninaweza kutengeneza UUIDs nyingi kwa wakati mmoja?

Ndiyo, hadi 1000 kwa mkupuo mmoja. Weka 'Idadi' na ubonyeze 'Tengeneza'; baada ya maadili hamsini (50) matokeo yanakuwa kizuizi kimoja kinachoweza kusongeshwa (scrollable) badala ya orodha ndefu ya mistari. 'Nakili Vyote' na 'Hifadhi kwenye faili' huchukua kundi zima, lililounganishwa kama 'Muundo wa kunakili' inavyosema — moja kwa kila mstari, kutenganishwa kwa koma, au kwenye nukuu ili kubandika (pasting) kwenye orodha (array).

Kwa nini v3 na v5 hunipa UUID ileile kila wakati?

Kwa sababu hilo ndilo kusudi lake. Matoleo ya 3 na 5 yanaamulika (deterministic): yanachanganya nafasi ya jina (namespace) na jina (name) unalowapa kuwa heshi, kwa hivyo pembejeo (inputs) zinazofanana daima hutoa kitambulisho kinachofanana, kwenye mashine yoyote na kwa lugha yoyote. Inaifanya iwe muhimu kwa kupata kitambulisho dhabiti kutoka kwa kitu ambacho tayari unacho, na hiyo pia ni kwa nini 'Idadi' imefichwa unapozichagua.

Nafasi ya jina (Namespace) na Jina (Name) ni nini, na ninapaswa kuchagua nafasi gani ya jina?

Hizo ndizo pembejeo (inputs) mbili ambazo toleo la 3 au toleo la 5 la UUID linakokotolewa. 'Nafasi ya jina' inaeleza jina lina asili gani — DNS kwa majina ya mwenyeji (host names), URL kwa anwani, OID na X.500 kwa mipango hiyo ya saraka (directory schemes), au 'Maalum' ukipenda kutoa UUID yako ya nafasi ya jina, ambalo ndilo chaguo la kawaida ndani ya programu tumizi (application). 'Jina' ni mfuatano wa herufi (string) wenyewe. Nafasi tofauti za majina hutoa matokeo tofauti kabisa kwa jina lilelile, jambo ambalo ndilo dhumuni la kuziweka.

Kwa nini UUID v7 ni bora kuliko v4 kwa ufunguo wa msingi wa hifadhidata?

Kwa sababu ya mahali ambapo maadili yanatua kwenye faharasa (index). Faharasa huwekwa katika mpangilio (sorted order), na ufunguo wa kubahatisha wa v4 hutua mahali popote pale ndani yake, kwa hivyo uingizaji (inserts) hugawanya kurasa kote kwenye mti (tree) na sehemu zinazoshikiliwa kwenye kumbukumbu (memory) mara chache ndizo sehemu zinazohitajika kufuata. Ufunguo wa v7 unaanza na milisekunde ya sasa, hivyo uingizaji unaofuatana unatua pamoja kwenye mwisho wa faharasa, ambayo ndiyo jinsi ufunguo wa mfuatano wa nambari (sequential integer key) hufanya kazi — huku ukiendelea kuruhusu huduma yoyote kutengeneza kitambulisho bila kuuliza kihesabu cha kati (central counter).

Je, UUIDs mbili zinaweza kuwa sawa?

Kinadharia ndiyo, kwa vitendo hapana, na inafaa kujua ni ipi iliyo kweli. Hakuna kinachothibitisha upekee (uniqueness): kuna tu maadili ya toleo la 4 yanayowezekana 2^122, takriban 5.3 undecillion (5.3 × 10^36), na ungehitaji takriban vitambulisho 2.7 quintillion (2.7 × 10^18) — UUID bilioni moja kwa sekunde kwa miaka 86 — kabla ya kuwepo kwa nafasi ya 50% ya mgongano mmoja kutokea. Dhamana hiyo ni ya kitakwimu badala ya kuwa kamili (absolute), na inategemea ubahatishaji kuwa halisi, ambalo ni sababu jenereta hii inatumia Web Crypto API badala ya kipengele cha kawaida cha bandia cha kubahatisha (ordinary pseudo-random function).

Je, ninaweza kutumia UUID kama nenosiri, ufunguo wa API au tokeni ya kikao?

Hapana, na hili ni kosa ambalo linagharimu zaidi. UUID ya toleo la 4 haitabiriki, lakini vitambulisho vinashughulikiwa kana kwamba viko wazi kwa umma: huishia kwenye URLs, historia ya kivinjari, logi za seva, vichwa vya virejeleaji (referrer headers) na takwimu (analytics). Toleo la 1 na toleo la 7 kwa kuongezea jinsi hufichua ni lini ziliundwa, na matoleo ya 3 na 5 yanaweza kukokotolewa upya (recomputed) na mtu yeyote anayejua pembejeo (inputs). Kwa chochote ambacho kinapaswa kubaki siri, tumia jenereta ya nenosiri au tokeni (token) kutoka kwenye maktaba iliyoundwa kwa siri.

Je, UUID v7 inafichua wakati ilipoundwa?

Ndiyo, hadi kwa milisekunde, na hiyo ni kwa makusudi (design) na wala si kosa — muhuri wa muda (timestamp) ndio unayoifanya v7 kupangwa. Mstari ulio chini ya matokeo unakuonyesha muda ulioingizwa kwenye thamani ya kwanza ya kundi, hivyo unaweza kuona hasa kile kinachofichuliwa. Toleo la 1 hubeba muhuri wa muda pia. Ikiwa muda wa kuumbwa ni kitu ambacho ungependa usikichapishe (not publish), toleo la 4 ndilo toleo ambalo halina muda wowote.

Je, UUID v1 inaweka wazi anwani yangu ya MAC?

Si hapa. Mfumo asilia ulitumia anwani ya kadi ya mtandao ya mashine kama sehemu ya nodi (node field), ambalo ndipo sifa ya v1 ilipotoka, lakini kiwango kinaruhusu kitambulisho cha nodi cha kubahatisha ambacho kina alama ya biti ya multicast, na hicho ndicho ambacho jenereta hii hutengeneza. Anwani ya maunzi yako (hardware address) haisomwi kamwe na haionekani kamwe kwenye matokeo.

Je, Herufi kubwa, Bila vistari, Mabano na urn:uuid: zinabadilisha nini?

Muonekano tu — biti 128 za msingi zinafanana katika kila umbo. 'Herufi kubwa' huchapisha tarakimu za heksadesimali (hex digits) kama herufi kubwa, 'Bila vistari' hutoa toleo fupi la herufi 32, 'Mabano' inafunga thamani ndani ya { } jinsi Windows na .NET huandika GUID, na urn:uuid: inaongeza kiambishi awali (prefix) ambacho huifanya kuwa URN rasmi. urn:uuid: inazima zote mbili huku ikiwa imewashwa, kwa sababu kiwango hufafanua muundo mmoja kamili wa URN na ndiyo ule wa kikanonika ulio na vistari (hyphenated one).