Başqa birinin yaratdığı, adını belə eşitmədiyiniz bir maşında olan və heç kimdən icazə almadan yarada biləcəyiniz, heç nə ilə toqquşmayacaq bir identifikatora ehtiyacınız var? Bu, məhz UUID-nin gördüyü işdir. O, tanış 8-4-4-4-12 şablonunda 36 simvol kimi yazılan 128 bitlik bir rəqəmdir və bütün dizaynı elə qurulub ki, heç nə kimin nəyi alacağını əlaqələndirməsə belə, onlardan ikisi heç vaxt eyni olmayacaq. Bu pulsuz generator onları birbaşa brauzerinizdə yaradır: "Versiya" bölməsində versiyanı seçin, "Say" bölməsində neçə ədəd lazım olduğunu bildirin və "Yarat" düyməsini basın. Səhifə bir çox layihələrin istədiyi versiya olan tək bir v4 ilə açılır, beləliklə ilk identifikatorunuz sadəcə bir klik uzaqlıqdadır.
Hər bir identifikator brauzeriniz tərəfindən Web Crypto API vasitəsilə qurulur. Versiya 4 brauzerin təmin etdiyi yerdə crypto.randomUUID(), əks halda isə crypto.getRandomValues() istifadə edir — Math.random() kimi yalançı təsadüfi JavaScript funksiyası əvəzinə kriptoqrafik cəhətdən güclü bir təsadüfilik mənbəyidir. Versiya 7 əvvələ 48 bitlik millisaniyə vaxt damğasını, sonra eyni millisaniyə daxilində artan 12 bitlik sayğacı, daha sonra isə RFC 9562-də təsvir olunan sıralama üsulu olan 62 təsadüfi biti yerləşdirir; məhz o sayğac sayəsində minlik partiya qarışıq deyil, sıra ilə çıxır. Versiya 1 vaxt damğasını multicast biti təyin edilmiş təsadüfi bir qovşaq identifikatoru ilə birləşdirir, ona görə də o, orijinal 1990-cı illərin tətbiqləri kimi şəbəkə kartınızın ünvanını heç vaxt daşımır. Versiyalar 3 və 5 heç də təsadüfi deyil: onlar müvafiq olaraq MD5 və SHA-1 istifadə edərək bir ad fəzasını və adı birlikdə heşləyirlər və bu heşləmə də sizin cihazınızda baş verir. Serverə heç nə göndərilmir, heç nə qeydə alınmır və səhifə yükləndikdən sonra o, əlaqə kəsildikdə belə işləməyə davam edir.
"Versiya" hər şeyi həll edən sahədir. Versiya 4 heç bir strukturu olmayan 122 təsadüfi bitdən ibarətdir — standartdır və identifikatorun sadəcə unikal olması lazım olduqda ən doğru cavabdır. Versiya 7 62 təsadüfi biti saxlayır, lakin yaradıldığı vaxtla başlayır, buna görə də onların bir qrupu yaradılma ardıcıllığına görə sıralanır; identifikator verilənlər bazası açarı olacaqsa, bu versiyanı seçmək lazımdır. Versiya 1 hələ də onu tələb edən sistemlər üçün burada saxlanılan, vaxta əsaslanan orijinal sxemdir. Versiyalar 3 və 5 fərqli bir cütdür: onlar deterministikdir, yəni eyni girişlər həmişə eyni identifikatoru yaradır və onlar iki əlavə sahə tələb edirlər — standart DNS, URL, OID və X.500 fəzalarından biri və ya öz "Fərdi ad fəzası (UUID)" olan "Ad fəzası" və müəyyən ediləcək sətir olan "Ad". v5-ə URL ad fəzasını və https://example.com/a sətrini verin, bu gün, sabah və başqasının maşınında eyni UUID-ni alacaqsınız. Məhz buna görə v3 və ya v5 seçildikdə "Say" yox olur: bir deterministik dəyərin min nüsxəsi sadəcə eyni deterministik dəyərin min nüsxəsi olardı. Qalan hər bir versiya üçün "Say" 1-dən 1000-ə qədərdir.
Dörd açar, altındakı 128 biti dəyişdirmədən çıxışın formasını dəyişdirir. "Böyük hərflər" onaltılıq rəqəmləri majuskulla yazır, "Defissiz" bəzi sütunların və fayl adlarının üstünlük verdiyi yığcam 32 simvollu formanı təqdim edir və "Fiqurlu mötərizələr" dəyəri { } mötərizələrinə salır — bu, Windows və .NET aləminin GUID adlandırdığı formadır. "Əlavə Seçimlər" altında urn:uuid: onu rəsmi bir URN edən prefiksi əlavə edir; o açıq olduqda "Fiqurlu mötərizələr" və "Defissiz" seçimlərini söndürür, çünki standart yalnız bir URN formasına icazə verir və bu, defisli qanuni formadır. "Kopyalama formatı" siz onları götürəndə partiyanın necə birləşdiriləcəyini müəyyən edir: hər sətirdə biri, vergüllərlə ayrılmış və ya koddakı massivə birbaşa yapışdırıla bilməsi üçün hər bir dəyər dırnaq içində və sonunda vergül olmaqla. Nəticənin altında bitlərlə təsadüfiliyi — v4 üçün 122, v7 üçün 62 — və v7 üçün partiyanın ilk identifikatorunda kodlanmış vaxt damğasını bildirən bir sətir yerləşir, beləliklə dəyərin içindəki vaxt yalnız nəzərdə tutulmur, həm də görünür. "Hamısını kopyala" və "Faylda saxla" hər ikisi "Kopyalama formatı"na əməl edir. "Tarixçə" son 10 partiyanızı öz brauzerinizdə saxlayır: birini geri qaytarmaq üçün üzərinə klikləyin, tək bir qeydi kopyalayın və ya silin, yaxud da hamısını təmizləyin. "Təmizlə" nəticəni boşaldır və parametrlərinizə toxunmur; 50 identifikatordan sonra isə siyahı əlli sətir əvəzinə sürüşdürülə bilən tək bir bloka çevrilir.
Bu səhifədəki ən vacib məqam ilkin açar (primary key) olaraq v4 və v7 arasındakı fərqdir və bu, zövq məsələsi deyil. Verilənlər bazası indeksləri çeşidlənmiş qaydada saxlanılan B-tree strukturlarıdır və yeni bir açarın bu ardıcıllıqda hara düşəcəyi daxiletmənin nə qədər iş tələb edəcəyini müəyyənləşdirir. v4 açarı təsadüfidir, ona görə də ardıcıl daxiletmələr indeksin bir-biri ilə əlaqəsiz künclərinə düşür: dolu olan səhifələr bölünür (page split), verilənlər bazasının yaddaşda saxladığı ağac hissələri nadir hallarda növbəti daxiletmənin ehtiyac duyduğu hissələr olur və indeks göstərdiyi sətirlərin tələb etdiyindən daha böyük və fraqmentləşdirilmiş olur. v7 açarı cari millisaniyə ilə başlayır, beləliklə ardıcıl daxiletmələr ağacın sağ kənarında bir-birinin yanına düşür, hansı ki bu, avtomatik artan tam ədədin yaratdığı şablondur və indeks strukturlarının ətrafında qurulduğu modeldir. Bütün mübadilə də məhz budur: v7 ardıcıl bir açarın daxiletmə davranışını sizə qazandırır, eyni zamanda UUID-ləri seçməyinizə səbəb olan o xüsusiyyəti — hər kəsin serverdən soruşmadan onu yarada bilməsi xüsusiyyətini qoruyub saxlayır. Bunun bədəli isə yaradılma vaxtının indi identifikatorun içində oxuna bilən olmasıdır və bunun əhəmiyyətli olub-olmaması formata deyil, sizin məlumatlarınıza aid bir sualdır.
Heç nə heç vaxt UUID-nin unikal olub-olmadığını yoxlamır; onun ölçüsü zəmanətidir. Heç bir reyestr, heç bir server gediş-gəlişi, heç bir axtarış yoxdur — generator bir rəqəm istehsal edir və onu təhvil verir, onlardan ikisinin toqquşmamasının səbəbi isə sadəcə v4 üçün 2^122, yəni təxminən 5,3 × 10^36 mümkün dəyərin olmasıdır. Ad günü problemi (birthday problem) bunu qiymətləndirməyin dürüst yoludur: hər hansı ikisinin uyğunlaşması ehtimalının 50% olması üçün sizə təxminən 2,7 × 10^18 identifikator lazım olacaqdır, bu isə 86 il ərzində hər saniyə bir milyard yeni UUID deməkdir. Bunun nəyə söz verib nəyə söz vermədiyi barədə dəqiq olmaq lazımdır. Bu, hesab zəmanəti deyil, statistik zəmanətdir və o, yalnız altındakı təsadüfilik real olduqda etibarlıdır — pis toxumlanmış bir generator (seed) və ya entropiya hovuzu ilə birlikdə klonlanmış virtual maşın, onu formatın aşkarlaya bilməyəcəyi bir şəkildə pozur. Versiya 7 sualı daha da daraldır: tək bir millisaniyə ərzində bir generator heç vaxt özünü təkrarlaya bilməz, çünki sayğac zər atmaq əvəzinə artır və müstəqil generatorlar arasında 62 təsadüfi bit bu işi görür.
UUID bir identifikatordur, parol deyil. Versiya 4 gözlənilməzdir və bu, insanları onu bir sirr kimi — parol sıfırlama linki, təxmin edilə bilməyən URL, sessiya tokeni, API açarı kimi istifadə etməyə şirnikləndirir. Gözlənilməzlik reallıqdır, lakin məxfilik dəyərlə necə rəftar edilməsinin xüsusiyyətidir və identifikatorlarla qəsdən ehtiyatsız davranılır: onlar URL-lərdə otururlar, brauzer tarixçəsinə, server jurnallarına, referrer başlıqlarına və analitikaya düşürlər və tez-tez söhbət mesajlarına yapışdırılırlar. Digər versiyalar daha pis namizədlərdir. Həm versiya 1, həm də versiya 7 yaradılma anını kodlayır, ona görə də onu əlində saxlayan hər kəs onun təxminən nə vaxt edildiyini bilir və onunla birlikdə yaradılmış hər şeyin əhatə dairəsini daralda bilər. Versiya 3 və 5 qəsdən deterministikdir: e-poçt ünvanının v5 UUID-si heşlənmiş bir sirr deyil, eyni ünvana malik hər kəsin bir saniyədə hesablaya biləcəyi bir dəyərdir. Bir şeyi adlandırmaq üçün UUID istifadə edin. Dəyərin bilinməməsi lazım olduqda parol generatoru və ya sirlər üçün qurulmuş kitabxanadan bir token istifadə edin.
Niyə bu UUID generatorunu seçməlisiniz?
- Yalnız brauzerdə yaratma: identifikatorlar cihazınızda hazırlanır və heç vaxt heç yerə göndərilmir
- Web Crypto API təsadüfiliyi: Math.random() deyil, kriptoqrafik cəhətdən təhlükəsiz
- Beş versiya bir yerdə: alətləri dəyişdirmədən v1, v3, v4, v5 və v7
- Həqiqi sıralanmış v7: RFC 9562-nin təsvir etdiyi kimi millisaniyə daxilində bir sayğac
- Dörd standart ad fəzası və ya öz ad fəzanızla deterministik v3 və v5
- Əllidən sonra yığcam sürüşdürülə bilən siyahı ilə eyni anda 1000-ə qədər
- Hər cür ümumi forma: defisli, sadə, böyük hərflərlə, fiqurlu mötərizədə və ya urn:uuid: URN
- Koda birbaşa yapışdırılan sətirlər, vergüllər və ya dırnaq içindəki dəyərlər kimi kopyalama
- Limitsiz və pulsuz: qeydiyyat yoxdur, istifadə limiti yoxdur, serverlərimizdə heç nə yoxdur
UUID-lər, adın boş olduğunu təsdiqləmədən əvvəl bir şeyin adlandırılmalı olduğu hər yerdə ortaya çıxır. Tətbiq kodu onları daxil edəcəyi sətirlər üçün yaradır, beləliklə obyekt verilənlər bazasına çatmamışdan əvvəl bir şəxsiyyətə malik olur və yazma əməliyyatı davam edərkən belə müştəri ona istinad edə bilir. Paylanmış sistemlər onlara daha çox arxalanır: eyni cədvələ yazan bir neçə xidmət, təyyarədə olarkən qeydlər yaradan oflayn mobil müştəri, artıq işlədiyi mesajı tanımalı olan növbə (queue) — bunların heç biri paylaşılan sayğac üçün öz növbəsini gözləyə bilməz. Versiya 5 fərqli bir ehtiyacı ödəyir, yəni əlinizdə olan bir şeydən əldə edilən sabit identifikator ehtiyacını: eyni sənəd, eyni URL və ya eyni hesab həmişə tamamilə eyni UUID-yə xəritələnir, beləliklə hər hansı bir idxal əməliyyatı heç nəyi dublikatlaşdırmadan iki dəfə icra oluna bilər. Başqa yerlərdə isə onlar sadəcə olaraq sistemin tələb etdiyi formatdır — jurnallar və izləmələrdən keçən korrelyasiya identifikatoru, minlərlə istifadəçinin yükləməsi tək bir qovluğa düşəndə toqquşmayacaq bir fayl adı, Windows registr açarı, real məlumat kimi görünməli olan test datası.
Bir neçə dürüst məhdudiyyəti bilməyə dəyər. Bir partiya bir versiyadır: "Versiya"dakı dəyər onun içindəki hər şeyə aiddir, buna görə də v4-lərin işə salınması və v7-lərin işə salınması iki fərqli partiyadır. Bu bir generatordur, müfəttiş deyil — versiyasını və ya vaxt damğasını oxumaq üçün bir UUID-ni yapışdırmaq bu səhifənin etdiyi bir şey deyil. "Faylda saxla" düyməsi CSV və ya JSON əvəzinə sadə mətn faylı yazır. Versiya 7 yaradıldığı vaxtı millisaniyəsinə qədər açıq şəkildə göstərir ki, bu bir qüsur yox, real bir mübadilədir və versiya 1 də zamanı eyni şəkildə sızdırır; əgər bu sizin məlumatlarınız üçün problemdirsə, versiya 4 heç kimə heç nə deməyən versiyadır. Standartdan gələn iki xüsusi dəyər versiya deyil və buna görə də "Versiya" bölməsində seçim kimi yer almır, lakin onları buradan kopyalaya bilərsiniz: nil UUID, 00000000-0000-0000-0000-000000000000 və max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Bu səhifədəki hər şey 2024-cü ildə RFC 4122-ni əvəz edən spesifikasiya olan RFC 9562-ni izləyir, buna görə də çıxış UUID-lərlə ümumiyyətlə işləyən hər hansı bir kitabxana, verilənlər bazası və ya API tərəfindən qəbul edilir. Bu məhdudiyyətlər daxilində zəmanət çox güclüdür: hər bir identifikator standarta uyğun, kriptoqrafik cəhətdən təhlükəsiz təsadüfilikdən, öz maşınınızda qurulur və onu heç vaxt başqa heç kim görmür.