Penjana UUID

Jana UUID di dalam pelayar anda: v4 yang rawak sepenuhnya, v7 tertib masa, atau v5 yang berketentuan. Sehingga 1000 sekaligus, semua dicipta pada peranti anda.

Tekan Jana untuk mengundi
Versi
Pilihan Lanjutan

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?

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.

FAQ

Bagaimanakah saya menjana satu UUID?

Pilih versi di dalam 'Versi', tetapkan jumlah yang anda perlukan di 'Bilangan pilihan', dan tekan 'Jana'. Halaman tersebut dibuka dengan satu pengecam versi 4 tunggal, yang dimahukan oleh kebanyakan projek, jadi satu UUID biasa tersedia hanya dengan satu klik. Setiap nilai terpapar dengan butang salinannya sendiri, dan 'Salin Semua' akan menyalin seluruh kumpulan tersebut dengan serentak.

Apakah perbezaan di antara UUID v4 dan v7?

Versi 4 ialah 122 bit rawak yang tiada sebarang struktur langsung, jadi dua daripadanya tidak mempunyai sebarang perkaitan di antara satu sama lain. Versi 7 memperuntukkan 48 bit pertama untuk milisaat ia dicipta, menambahkan satu pembilang dan 62 bit rawak, dan justeru itu ia boleh diisih: kumpulan keluar mengikut susunan ia dibuat. Gunakan v4 apabila pengecam hanya perlu menjadi unik, dan v7 apabila ia juga akan menjadi kunci pangkalan data.

Versi UUID yang manakah patut saya gunakan?

Versi 4 melainkan jika anda mempunyai alasan untuk memilih versi yang lain. Pilih versi 7 sekiranya pengecam menjadi satu kunci utama dan prestasi sisipan (insert) adalah penting, versi 5 sekiranya anda memerlukan input yang sama untuk sentiasa menghasilkan pengecam yang sama, dan versi 1 sahaja jika satu sistem yang akan anda bercakap dengannya secara khusus memintanya. Versi 3 ialah versi 5 dengan MD5 dan bukannya SHA-1, dan wujud kerana keserasian.

Adakah UUID yang dijana benar-benar rawak dan selamat?

Kerawakan tersebut kukuh secara kriptografi: ia datang dari Web Crypto API pelayar anda, melalui crypto.randomUUID() atau crypto.getRandomValues(), bukan dari Math.random(). Selamat dari segi sukar untuk dijangka adalah berbeza dengan selamat dari segi rahsia — satu UUID ialah satu pengecam, dan tidak seharusnya digunakan sebagai satu kata laluan, token sesi mahupun kunci API.

Bolehkah saya menjana banyak UUID sekaligus?

Ya, sehingga 1000 sekaligus. Tetapkan 'Bilangan pilihan' dan tekan 'Jana'; selepas melepasi lima puluh nilai hasil tersebut akan dipaparkan sebagai satu blok boleh skrol tunggal berbanding sebagai senarai baris yang panjang. 'Salin Semua' dan 'Simpan ke fail' mengambil keseluruhan kelompok, digabungkan dengan cara yang diterangkan pada 'Format salinan' — satu setiap baris, dipisahkan dengan koma, atau berpetik untuk ditampal ke dalam tatasusunan.

Mengapakah v3 dan v5 sentiasa memberikan saya UUID yang sama setiap kali?

Kerana itulah tujuannya. Versi 3 dan 5 adalah bersifat berketentuan: ia mencincang (hash) ruang nama dan nama yang anda berikan kepadanya, jadi input yang serupa sentiasa menghasilkan pengecam yang serupa, pada mana-mana mesin dan di dalam mana-mana bahasa. Ini menjadikannya sangat sesuai untuk menerbitkan satu pengecam yang stabil daripada sesuatu yang telah anda punyai, dan kerana itulah 'Bilangan pilihan' tersembunyi tatkala anda memilihnya.

Apakah Ruang nama (Namespace) dan Nama (Name), dan ruang nama apakah yang perlu saya pilih?

Ia merupakan dua input yang UUID versi 3 atau versi 5 dikirakan daripadanya. 'Ruang nama' menjelaskan jenis sesuatu nama tersebut — DNS untuk nama hos, URL untuk alamat, OID dan X.500 untuk skim direktori, atau 'Tersuai' jika anda mahu menyediakan ruang nama UUID sendiri, yang lazimnya dijadikan pilihan dalam aplikasi. 'Nama' ialah rentetan (string) itu sendiri. Ruang nama yang berbeza memberikan hasil yang berbeza sama sekali untuk nama yang serupa, yang merupakan fungsi adanya ruang nama.

Mengapakah UUID v7 lebih baik daripada v4 untuk kunci utama pangkalan data?

Ini kerana di mana nilai-nilai akan mendarat di dalam indeks. Indeks disimpan di dalam susunan berisih, dan satu kunci v4 yang rawak akan mendarat secara sembarangan di dalamnya, jadi sisipan akan memecahkan laman (page) pada merata-rata pokok dan sebahagian yang disimpan di dalam ingatan (memory) itu pun tidak semestinya digunakan seterusnya. Satu kunci v7 bermula dengan detik milisaat sekarang, jadi sisipan berturut-turut mendarat bersama di bahagian hujung indeks, seolah-olah tabiat satu kunci nombor bulat berturutan — lantas pada masa yang sama, juga membenarkan apa-apa perkhidmatan untuk membina identiti tanpa perlu merujuk pada pusat pengiraan.

Bolehkah dua UUID menjadi sama?

Pada dasarnya ya, pada praktiknya tidak, dan anda wajar tahu yang manakah berlaku. Tiada apa-apa yang mengesahkan keunikan: hanya terdapat 2^122 nilai versi 4 yang mungkin, kira-kira 5.3 un-desilion (5.3 × 10^36), dan anda memerlukan kira-kira 2.7 kuintilion (2.7 × 10^18) daripadanya — satu bilion setiap saat selama 86 tahun — sebelum terdapat peluang sama rata, iaitu 50%, untuk satu pertembungan tunggal. Jaminan itu bersifat statistik dan bukannya mutlak, dan ia bergantung pada kerawakan di bawahnya yang tulen; itulah sebabnya penjana ini menggunakan Web Crypto API dan bukannya fungsi rawak pseudo yang biasa.

Bolehkah saya menggunakan UUID sebagai satu kata laluan, kunci API atau token sesi?

Tidak, dan inilah kesilapan yang paling mahal. Satu UUID versi 4 tidak dapat dijangka, tetapi pengecam dikendalikan seolah-olah ia terbuka kepada umum: ia berakhir di dalam URL, sejarah pelayar, log pelayan, pengepala perujuk (referrer) dan analitik. Versi 1 dan 7 turut mendedahkan masa ia dicipta, dan versi 3 dan 5 boleh dikira semula oleh sesiapa sahaja yang mengetahui inputnya. Untuk apa-apa yang mesti kekal rahsia, gunakan satu penjana kata laluan atau satu token daripada pustaka yang dibina untuk kerahsiaan.

Adakah UUID v7 mendedahkan masa bilakah ia dicipta?

Ya, sehingga tahap milisaat, dan itu memang direka begitu dan bukannya satu kecuaian — cap masa itulah yang menjadikan v7 boleh diisih. Baris di bawah hasil menunjukkan kepada anda masa yang dikodkan di dalam nilai pertama kumpulan tersebut, jadi anda boleh melihat dengan tepat apa yang terdedah. Versi 1 juga membawa satu cap masa. Jika masa penciptaan adalah sesuatu yang anda tidak mahu dedahkan, versi 4 langsung tidak mengandungi masa.

Adakah UUID v1 mendedahkan alamat MAC saya?

Bukan di sini. Skim asal menggunakan alamat kad rangkaian mesin sebagai medan nod (node), dan dari situlah datangnya reputasi v1, tetapi piawaian juga membenarkan satu pengecam nod rawak yang ditanda dengan bit multisiar (multicast), dan itulah yang dihasilkan oleh penjana ini. Alamat perkakasan anda tidak pernah dibaca dan tidak pernah muncul di dalam hasil.

Apakah yang diubah oleh Huruf besar, Tanpa sempang, Kurungan dakap dan urn:uuid:?

Persembahannya sahaja — 128 bit di bawahnya adalah serupa dalam setiap bentuk. 'Huruf besar' mencetak digit heksadesimal sebagai huruf kapital, 'Tanpa sempang' memberikan bentuk 32 aksara yang padat, 'Kurungan dakap' membalut nilai di dalam { } seperti cara Windows dan .NET menulis satu GUID, manakala urn:uuid: menambah awalan yang menjadikannya satu URN rasmi. urn:uuid: mematikan kedua-dua yang lain semasa ia aktif, kerana piawaian menentukan tepat satu bentuk URN dan ia merupakan bentuk bersempang yang berkanun.