Perlukan satu pengecam yang tidak akan bertembung dengan pengecam yang dibuat oleh orang lain, pada mesin yang anda tidak pernah dengar, tanpa perlu meminta kebenaran sesiapa? Itulah tugas yang dilakukan oleh UUID. Ia adalah satu nombor 128-bit, ditulis sebagai 36 aksara dalam corak 8-4-4-4-12 yang biasa kita lihat, dan keseluruhan reka bentuknya memastikan mana-mana dua UUID tidak akan sama walaupun tiada sesiapa yang menyelaraskan siapa mendapat yang mana. Penjana percuma ini menciptanya di dalam pelayar anda: pilih satu versi di dalam 'Versi', nyatakan bilangan yang anda perlukan di 'Bilangan pilihan', dan tekan 'Jana'. Halaman ini dibuka dengan satu v4, versi yang dimahukan oleh kebanyakan projek, jadi pengecam pertama anda sedia dengan hanya satu klik.
Setiap pengecam dibina oleh pelayar anda melalui Web Crypto API. Versi 4 menggunakan crypto.randomUUID() di mana pelayar menyediakannya dan menggunakan crypto.getRandomValues() di pelayar lain — satu sumber kerawakan yang kuat dari segi kriptografi berbanding fungsi rawak pseudo JavaScript seperti Math.random(). Versi 7 meletakkan cap masa milisaat 48-bit di hadapan, diikuti dengan satu pembilang 12-bit yang menaik di dalam milisaat yang sama, kemudian 62 bit rawak, dan ini adalah kaedah susunan yang diterangkan dalam RFC 9562; pembilang itulah sebabnya satu kumpulan seribu UUID keluar mengikut urutan dan bukannya rawak. Versi 1 menggabungkan satu cap masa dengan satu pengecam nod rawak yang mempunyai bit multisiar (multicast) ditetapkan, jadi ia tidak pernah membawa alamat kad rangkaian anda seperti yang dilakukan oleh pelaksanaan asal pada tahun 1990-an. Versi 3 dan 5 tidak rawak sama sekali: kedua-duanya mencincang (hash) satu ruang nama berserta satu nama, menggunakan MD5 dan SHA-1 masing-masing, dan proses cincangan tersebut juga berlaku di peranti anda. Tiada apa-apa yang dihantar ke pelayan, tiada apa-apa yang dilogkan, dan setelah halaman dimuatkan ia akan terus berfungsi walaupun sambungan terputus.
'Versi' ialah medan yang menentukan segala-galanya. Versi 4 ialah 122 bit rawak dan tiada sebarang struktur — ia adalah lalai, dan jawapan yang tepat apabila satu pengecam hanya perlu menjadi unik. Versi 7 mengekalkan 62 bit rawak tetapi didahului dengan masa ia dicipta, jadi satu set v7 akan diisih mengikut urutan ia dibuat; itulah yang menjadikannya versi pilihan apabila pengecam akan menjadi satu kunci pangkalan data. Versi 1 ialah skim berasaskan masa yang asal, dikekalkan di sini untuk sistem yang masih memintanya. Versi 3 dan 5 adalah pasangan yang aneh: kedua-duanya bersifat berketentuan, bermakna input yang sama sentiasa menghasilkan pengecam yang sama, dan ia memerlukan dua medan tambahan — 'Ruang nama', yang merupakan salah satu ruang piawai DNS, URL, OID dan X.500 atau ruang 'Tersuai' anda sendiri, dan 'Nama', rentetan yang sedang dikenal pasti. Masukkan ruang nama URL dan https://example.com/a ke dalam v5 dan anda akan mendapat UUID yang sama pada hari ini, esok dan pada komputer orang lain. Oleh sebab itu, 'Bilangan pilihan' hilang apabila v3 atau v5 dipilih: seribu salinan daripada satu nilai yang berketentuan akan menjadi seribu salinan daripada satu nilai yang berketentuan juga. Untuk semua versi lain 'Bilangan pilihan' berjulat dari 1 hingga 1000.
Empat suis menukar bentuk output tanpa mengubah 128 bit di bawahnya. 'Huruf besar' mencetak digit heksadesimal sebagai huruf kapital, 'Tanpa sempang' memberikan bentuk 32 aksara padat yang digemari oleh sesetengah lajur dan nama fail, manakala 'Kurungan dakap' membalut nilai di dalam { } — bentuk yang dipanggil GUID oleh dunia Windows dan .NET. Di bawah 'Pilihan Lanjutan', urn:uuid: menambah awalan yang menjadikannya satu URN rasmi; ia akan mematikan 'Kurungan dakap' dan 'Tanpa sempang' semasa ia aktif, kerana piawaian membenarkan tepat satu bentuk URN dan ia merupakan bentuk bersempang yang berkanun. 'Format salinan' memutuskan bagaimana satu kumpulan digabungkan apabila anda mengambilnya: satu setiap baris, dipisahkan dengan koma, atau setiap nilai di dalam petikan dengan koma di hujung, yang tampal terus ke dalam satu tatasusunan di dalam kod. Di bawah hasil duduknya satu baris yang melaporkan kerawakan dalam bit — 122 untuk v4, 62 untuk v7 — dan, untuk v7, cap masa yang dikodkan di dalam pengecam pertama daripada kumpulan tersebut, supaya masa di dalam nilai boleh dilihat berbanding dengan disiratkan. 'Salin Semua' dan 'Simpan ke fail' mematuhi 'Format salinan'. 'Sejarah' menyimpan 10 kumpulan terakhir anda di dalam pelayar anda sendiri: klik salah satu untuk membawanya kembali, salin atau padam entri tunggal, atau kosongkan kesemuanya. 'Kosongkan' membersihkan hasil dan membiarkan tetapan anda, dan melepasi 50 pengecam senarai tersebut menjadi satu blok yang boleh diskrol dan bukannya lima puluh baris.
Perkara yang paling penting pada halaman ini ialah perbezaan antara v4 dan v7 sebagai satu kunci utama (primary key), dan ini bukan satu isu cita rasa. Indeks pangkalan data ialah pokok yang disimpan dalam susunan berisih, dan di mana satu kunci baharu mendarat di dalam susunan tersebut memutuskan berapa banyak kerja yang akan dikenakan oleh sisipan (insert). Satu kunci v4 adalah rawak, jadi sisipan berturut-turut mendarat di dalam penjuru indeks yang tidak berkaitan: halaman yang telah penuh akan dipecahkan, bahagian-bahagian pokok yang dipegang oleh pangkalan data di dalam memori jarang merupakan bahagian yang diperlukan oleh sisipan seterusnya, dan akhirnya indeks tersebut menjadi lebih besar dan terpecah berbanding apa yang wajar untuk baris yang ditunjuknya. Satu kunci v7 didahului dengan milisaat semasa, jadi sisipan berturut-turut mendarat bersebelahan antara satu sama lain pada pinggir sebelah kanan pokok, iaitu corak yang dihasilkan oleh integer menaik secara automatik (auto-incrementing integer) dan corak struktur indeks dibina. Itulah seluruh tolak ansurnya: v7 memberikan anda tingkah laku sisipan bagi kunci jujukan (sequential key) sambil mengekalkan ciri yang membuatkan anda memilih UUID pada mulanya, iaitu sesiapa sahaja boleh menempa satu tanpa perlu bertanya pada pelayan. Apa kosnya ialah masa penciptaan kini boleh dibaca di dalam pengecam tersebut, dan sama ada ia penting atau tidak ialah satu soalan mengenai data anda, bukannya mengenai format.
Tiada apa-apa yang pernah menyemak satu UUID untuk keunikan; saiznya adalah jamiannya. Tiada pendaftaran, tiada perjalanan pergi balik pelayan, tiada pencarian — satu penjana menghasilkan satu nombor dan menyerahkannya, dan sebab mana-mana dua tidak bertembung adalah hanya kerana terdapat 2^122 nilai versi 4 yang mungkin, kira-kira 5.3 un-desilion (5.3 × 10^36). Masalah hari jadi (birthday problem) merupakan cara yang jujur untuk mengukur perkara itu: anda memerlukan kira-kira 2.7 kuintilion (2.7 × 10^18) pengecam sebelum terdapat peluang sama rata untuk mana-mana dua UUID berpadanan, iaitu satu bilion UUID baharu setiap saat selama 86 tahun. Ia berbaloi untuk menjadi tepat tentang apa yang dijanjikan dan tidak dijanjikannya. Ia merupakan satu jaminan secara statistik, bukan secara aritmetik, dan ia hanya sah semasa kerawakan di bawahnya adalah tulen — satu penjana yang menerima benih (seed) yang buruk, atau mesin maya yang diklon bersama kolam entropinya, memecahkannya dengan cara yang tidak dapat dikesan oleh format tersebut. Versi 7 menyempitkan lagi persoalan ini: di dalam satu milisaat tunggal satu penjana tidak boleh mengulanginya sendiri langsung, kerana pembilang tersebut menaik dan tidak membaling dadu, dan merentasi penjana bebas, 62 bit rawak itu akan melakukan kerjanya.
Satu UUID ialah pengecam, bukan kata laluan. Versi 4 tidak boleh dijangka, dan itu mendorong orang untuk menganggapnya sebagai satu rahsia — pautan set semula kata laluan, URL yang tidak boleh diagak, token sesi, kunci API. Ketidakpastian itu memang benar, tetapi kerahsiaan merupakan sifat bagaimana satu nilai itu dikendalikan, dan pengecam dikendalikan dengan tidak berhati-hati melalui reka bentuknya: ia wujud di dalam URL, yang mendarat di dalam sejarah pelayar, log pelayan, pengepala perujuk (referrer) dan analitik, dan disalin masuk ke dalam mesej sembang. Versi lain merupakan calon yang lebih buruk. Versi 1 dan versi 7 kedua-duanya mengekodkan saat penciptaan, jadi sesiapa sahaja yang memegang salah satu akan mengetahui secara kasar masa ia dibuat dan boleh mengecilkan julat kejiranan (neighbourhood) untuk segala-gala yang dibuat bersamanya. Versi 3 dan 5 bersifat berketentuan dengan sengaja: UUID v5 bagi satu alamat e-mel bukanlah satu rahsia yang dicincang, ia merupakan nilai yang sesiapa yang mempunyai alamat yang sama boleh mengiranya dalam masa sesaat. Gunakan satu UUID untuk menamakan sesuatu. Gunakan satu penjana kata laluan, atau satu token daripada pustaka yang dibina untuk kerahsiaan, apabila nilai tersebut perlu kekal tidak diketahui.
Mengapakah patut memilih penjana UUID ini?
- Penjanaan hanya pelayar: pengecam dibuat pada peranti anda dan tidak pernah dihantar ke mana-mana
- Kerawakan Web Crypto API: kukuh secara kriptografi, bukan Math.random()
- Lima versi di satu tempat: v1, v3, v4, v5 dan v7, tanpa perlu menukar alat
- v7 yang tulen tertib: satu pembilang di dalam milisaat, seperti yang RFC 9562 huraikan
- v3 dan v5 yang berketentuan dengan empat ruang nama piawai atau ruang anda sendiri
- Sehingga 1000 sekaligus, dengan satu senarai kompak yang boleh diskrol selepas lima puluh baris
- Setiap bentuk biasa: bersempang, kosong, huruf besar, dikurungkan atau satu URN urn:uuid:
- Salin sebagai baris, koma atau nilai berpetik yang ditampal terus ke dalam kod
- Tiada had dan percuma: tiada pendaftaran, tiada had penggunaan, tiada apa-apa pada pelayan kami
UUID muncul di mana sahaja sesuatu mesti dinamakan sebelum apa-apa boleh mengesahkan yang nama tersebut lapang. Kod aplikasi menempanya untuk baris yang ia mahu sisipkan, jadi objek tersebut mempunyai satu identiti sebelum ia pernah mencapai pangkalan data dan pelanggan boleh merujuknya manakala penulisan masih sedang berjalan. Sistem teragih lebih bergantung padanya: beberapa perkhidmatan yang menulis ke dalam satu jadual, pelanggan mudah alih luar talian yang mencipta rekod di dalam kapal terbang, satu gilir yang perlu mengenali mesej yang telah diprosesnya — tiada satu pun daripada mereka ini boleh menunggu giliran untuk sebuah pembilang kongsi. Versi 5 memenuhi satu keperluan yang berbeza, iaitu satu pengecam yang stabil yang diperoleh daripada sesuatu yang sudah anda miliki: dokumen yang sama, URL yang sama atau akaun yang sama sentiasa memetakan kepada UUID yang sama, jadi satu import boleh berjalan dua kali tanpa menduplikasi apa-apa. Di tempat lain ia hanyalah format yang dituntut oleh satu sistem — satu pengecam korelasi yang melalui log dan surihan, nama fail yang tidak akan bertembung apabila fail muat naik daripada seribu pengguna mendarat dalam baldi (bucket) yang sama, kunci pendaftaran Windows, satu penetap ujian (test fixture) yang perlu kelihatan seperti data yang sebenar.
Beberapa had yang jujur adalah berbaloi untuk diketahui. Satu kumpulan ialah satu versi: nilai pada 'Versi' dikenakan pada segala-gala yang di dalamnya, jadi larian v4 dan larian v7 adalah dua kumpulan berasingan. Ini ialah penjana, bukan pemeriksa — menampal satu UUID ke dalam untuk membaca kembali versi atau cap masanya bukanlah perkara yang dilakukan oleh halaman ini. 'Simpan ke fail' menulis satu fail teks biasa dan bukannya CSV atau JSON. Versi 7 secara terbuka mendedahkan masa ia dicipta, sehingga tahap milisaat, dan ia merupakan tolak ansur sebenar dan bukannya kepincangan, dan versi 1 membocorkan masa dengan cara yang sama; jika itu menjadi masalah untuk data anda, versi 4 ialah versi yang tidak akan memberitahu sesiapa apa-apa pun. Dua nilai khas daripada piawaian bukanlah versi jadi ia tidak akan menjadi pilihan di dalam 'Versi', namun anda boleh menyalinnya dari sini: UUID nil, 00000000-0000-0000-0000-000000000000, dan UUID max, ffffffff-ffff-ffff-ffff-ffffffffffff. Segala-gala di dalam halaman ini mematuhi RFC 9562, spesifikasi yang menggantikan RFC 4122 pada tahun 2024, jadi hasilnya akan diterima oleh mana-mana pustaka, pangkalan data atau API yang mengendalikan UUID sepenuhnya. Di dalam batasan-batasan tersebut jamiannya adalah kuat: setiap pengecam dibina mengikut standard, daripada kerawakan yang kukuh secara kriptografi, pada mesin anda sendiri, dan tiada sesiapa yang lain pernah melihatnya.