Generator ULID

Hasilkan ULID secara online: ID Crockford Base32 sepanjang 26 karakter dengan waktu 48-bit dan 80 bit acak.

Format
ID yang Dihasilkan
Siap. Hasilkan ULID langsung di browser Anda.

Bagaimana ID ini dibuat

Tata letak
26 karakter Crockford Base32: terdiri dari 10 karakter waktu diikuti oleh 16 karakter acak.
Entropi
80 bit acak setelah stempel waktu milidetik sepanjang 48-bit.
Waktu
Ya. 10 karakter pertama mengodekan waktu dalam milidetik, sehingga urutan leksikalnya mengikuti urutan waktu pembuatan.
Risiko tabrakan data
Bagian akhir yang acak memiliki 80 bit; risiko tabrakan data terutama bergantung pada seberapa banyak ID yang Anda buat dalam milidetik yang sama.
Contoh
01M12BRPWGZC3TWXGDMGG56K7P

ID Anda dibuat secara lokal dengan keacakan browser yang kuat. Tidak ada data yang dikirim ke BroBroGo.

Tanya Jawab

Apa kegunaan utama ULID?

ULID berukuran ringkas, ramah URL, dan dapat diurutkan berdasarkan waktu sebagai teks biasa. Sangat berguna untuk log, kunci objek, dan catatan database yang perlu diurutkan berdasarkan waktu pembuatan.

Apakah ULID sama dengan UUID v7?

Tidak. Meskipun keduanya menyertakan waktu dalam milidetik, ULID menggunakan format Crockford Base32 sepanjang 26 karakter, sedangkan UUID v7 mempertahankan format heksadesimal standar UUID.

ULID: Alternatif ID yang Lebih Pendek, Terurut Waktu, dan Siap Disalin

Halaman ini menawarkan satu fungsi spesifik: menghasilkan daftar ULID (Universally Unique Lexicographically Sortable Identifier) dalam jumlah yang Anda tentukan, antara 1 hingga 100, dengan satu klik. Tidak seperti generator UUID yang menyediakan banyak versi dan opsi format, halaman ini hanya menampilkan ULID—tanpa tombol untuk mengubah huruf besar/kecil atau menambahkan tanda hubung, karena format ULID memang tidak mendukung keduanya. Setiap ID yang dihasilkan adalah string 26 karakter yang tidak peka huruf besar/kecil dan langsung siap disalin, baik satu per satu maupun seluruh daftar sekaligus.

Keunikan utama ULID dibandingkan format lain di alat yang sama adalah panjangnya yang lebih pendek (26 karakter vs. 36 karakter UUID), penggunaan alfabet Crockford base32 yang membuatnya tidak peka huruf besar/kecil dan bebas dari tanda hubung, serta kemampuannya untuk diurutkan secara leksikografis berdasarkan waktu pembuatan. Sepuluh karakter pertama setiap ULID menyandikan stempel waktu resolusi milidetik, sehingga ID baru akan muncul setelah ID lama dalam pengurutan abjad.


Struktur Internal ULID: 128 Bit dalam 26 Karakter

ULID menyimpan 128 bit informasi, sama seperti UUID. Namun, pembagian bitnya berbeda dan cara pengodeannya menghasilkan representasi yang lebih ringkas.

  • 10 karakter pertama (48 bit): stempel waktu (timestamp) dalam milidetik sejak Unix epoch (1 Januari 1970 00:00:00 UTC). Nilai ini di-encode menggunakan Crockford base32, yang menghasilkan karakter 0-9 dan A-Z tanpa huruf I, L, O, U, dan tidak peka huruf besar/kecil. Dengan 48 bit, stempel waktu dapat menjangkau hingga tahun 10889 M (2^48 milidetik ≈ 8.925 tahun).
  • 16 karakter terakhir (80 bit): komponen acak (random) yang dihasilkan menggunakan crypto.getRandomValues() di browser pengguna. Ini memastikan bahwa ULID yang dihasilkan dalam milidetik yang sama tetap unik, meskipun urutannya tidak dijamin (lihat bagian batasan).

Total 26 karakter ini dihasilkan dengan menggabungkan hasil encode timestamp dan random, lalu menyusunnya sebagai string Crockford base32. Alfabet ini menghilangkan karakter yang mudah tertukar secara visual (misalnya huruf I, L, O, U dengan angka 1, 0) sehingga lebih mudah ditranskripsi secara manual.

Contoh ILUSTRASI (bukan nilai nyata):
01ARZ3NDEKTSV4RRFFQ69G5FAV

  • 01ARZ3NDEK = timestamp dalam base32 (misal mewakili 1469918176385 ms)
  • TSV4RRFFQ69G5FAV = random 80 bit dalam base32

Perhatikan tidak ada tanda hubung. ULID selalu ditulis tanpa pemisah.


Keunggulan Dibanding UUID v4 dan UUID v7

Fitur ULID UUID v4 UUID v7
Panjang string 26 karakter 36 karakter (termasuk 4 tanda hubung) 36 karakter (termasuk 4 tanda hubung)
Case sensitivity Tidak peka (case‑insensitive) Peka (hanya huruf kecil direkomendasikan) Peka (hanya huruf kecil direkomendasikan)
Tanda hubung Tidak ada 4 tanda hubung 4 tanda hubung
Urut berdasarkan waktu Ya (leksikografis pada milidetik) Tidak Ya (partial, dengan bit random)
URL‑safe tanpa escape Ya (semua karakter unreserved di RFC 3986) Ya (setelah hilangkan "-") Ya (setelah hilangkan "-")
Ukuran penyimpanan (tanpa format) 128 bit 128 bit 128 bit
Proses generasi Timestamp 48-bit + random 80-bit Random 122-bit + versi 4-bit Timestamp 48-bit + random 74-bit + varian 6-bit

Mengapa ini penting?

  • Lebih pendek: menghemat ruang di URL, log, dan database.
  • Case‑insensitive: tidak ada risiko kesalahan saat menyalin karena huruf besar/kecil. Pengguna bisa mengetik manual dengan huruf kecil semua dan tetap valid.
  • Sortable berdasarkan waktu: memungkinkan ID baru ditempatkan di akhir daftar saat diurutkan secara leksikografis. Ini sangat membantu untuk primary key di database B‑tree karena mengurangi fragmentasi halaman.
  • URL‑safe: tidak perlu melakukan percent‑encoding terhadap karakter apapun, karena semua karakter dalam Crockford base32 termasuk unreserved menurut RFC 3986 (0‑9, A‑Z, a‑z tanpa karakter khusus).

Cara Kerja Generator Ini

Input yang diperlukan hanya satu: jumlah ID yang akan dihasilkan, yaitu bilangan bulat antara 1 dan 100. Format sudah tetap "ULID", tidak ada opsi lain. Setelah Anda mengisi count dan menekan tombol generate (atau secara otomatis jika count berubah), tool akan:

  1. Membaca nilai count.
  2. Menghasilkan timestamp saat ini dalam milidetik menggunakan Date.now().
  3. Memanggil crypto.getRandomValues() untuk mendapatkan 80 bit acak per ULID.
  4. Mengkodekan timestamp 48 bit ke Crockford base32 (10 karakter).
  5. Mengkodekan random 80 bit ke Crockford base32 (16 karakter).
  6. Menggabungkan keduanya menjadi string 26 karakter.
  7. Mengulangi langkah 3–6 sebanyak count kali.
  8. Menampilkan daftar ULID dalam urutan generasi.
  9. Memperbarui status menjadi "Generated." setelah selesai.

Setiap ULID dapat disalin satu per satu dengan mengkliknya. Tombol "Copy All" akan menyalin seluruh daftar ke clipboard. Setelah berhasil, status berubah menjadi "Copied all!".

Apa yang terjadi jika opsi diubah?
Mengubah format (misalnya ke UUID atau NanoID) atau menyesuaikan count akan langsung meregenerasi daftar ID. ULID yang sebelumnya dihasilkan akan hilang.


Batasan dan Aturan Penting

  1. Tidak ada jaminan urutan dalam milidetik yang sama.
    Karena komponen random mendominasi 80 bit, dua ULID yang dihasilkan dalam milidetik yang persis sama dapat memiliki urutan leksikografis yang sembarang. Jika kebutuhan Anda memerlukan urutan deterministik dalam milidetik yang sama, ULID bukan pilihan tepat.

  2. Count dibatasi 1–100.
    Nilai di luar rentang ini tidak diterima. Untuk kebutuhan massal, Anda harus menjalankan beberapa kali generate.

  3. Semua generasi dilakukan di browser.
    Tidak ada data yang dikirim ke server. Keacakan bersumber dari crypto.getRandomValues(), yang merupakan antarmuka kriptografis standar di browser modern. Ini berarti:

    • Tidak ada risiko kebocoran ID melalui jaringan.
    • Cocok untuk aplikasi yang memerlukan privasi tinggi.
  4. Tidak ada opsi uppercase/lowercase atau hyphen.
    ULID secara inheren tidak peka huruf besar/kecil dan tidak memiliki tanda hubung. Tool ini tidak menyediakan kontrol tambahan karena tidak relevan.

  5. Probabilitas tabrakan (collision).
    Dengan 80 bit random, probabilitas terjadinya ULID yang sama dalam satu milidetik sangat kecil. Untuk produksi 1.000 ULID per milidetik, probabilitas tabrakan sekitar 2.7 × 10^-7 (menggunakan perkiraan birthday bound). Dalam praktiknya, karena generator ini berjalan di browser tunggal dan dalam satu sesi, risiko collision praktis nol.


Siapa yang Membutuhkan ULID?

  • Web dan mobile developer yang ingin menghasilkan ID yang lebih pendek dari UUID, URL‑safe, dan dapat diurutkan berdasarkan waktu tanpa perlu kolom timestamp terpisah.
  • Administrator database yang merancang primary key dengan performa B‑tree yang baik. ULID yang monotonik meningkat mengurangi split page dan fragmentasi indeks dibandingkan UUID v4 acak.
  • Arsitek sistem terdistribusi yang membutuhkan ID unik di banyak node tanpa koordinasi pusat. Timestamp dan random dapat dikombinasikan dengan ID node (meskipun di sini hanya random, tetapi pola serupa dapat dikustomisasi).
  • Desainer API yang ingin mengekspos ID publik yang sulit ditebak (karena random 80 bit) namun tetap bersahabat bagi manusia (tanpa campuran huruf besar/kecil yang membingungkan, tanpa tanda hubung yang rentan salah baca).
  • Siapa pun yang merasa UUID terlalu panjang dan tidak praktis, terutama saat ditranskripsi secara manual atau ditampilkan di URL.

FAQ (Pertanyaan yang Sering Diajukan)

1. Apakah ULID aman secara kriptografis?
Komponen random dihasilkan dari crypto.getRandomValues(), yang merupakan sumber keacakan kriptografis. Namun, ULID bukanlah token keamanan seperti session ID. Jika Anda memerlukan ketidaktebakan tingkat tinggi (misalnya untuk token reset password), pertimbangkan untuk menggunakan string random lebih panjang atau mekanisme hash.

2. Bisakah saya mengubah ULID menjadi UUID?
Secara teknis, Anda dapat mengonversi 128 bit ULID ke format UUID (misal dengan menyusun ulang bit sesuai versi 4 atau 7), tetapi tidak ada standar resmi untuk itu. Biasanya lebih mudah tetap menggunakan ULID sebagai string unik.

3. Apakah ULID mendukung huruf kecil?
Ya. Karena Crockford base32 tidak peka huruf besar/kecil, representasi huruf kecil (misal 01arz3ndektsv4rrffq69g5fav) sama validnya dengan huruf besar. Tool ini menghasilkan ULID dalam huruf besar karena konvensi umum.

4. Apa yang terjadi jika saya menjalankan generator di beberapa tab browser secara bersamaan?
Karena timestamp diambil dari jam sistem, dan random dihasilkan independen, kemungkinan tabrakan ULID antar tab sangat rendah (dalam orde 2^-80). Namun, jika milidetiknya sama, urutan leksikografis tidak terjamin.

5. Dapatkah saya menggunakan ULID sebagai primary key di MySQL/PostgreSQL?
Bisa, tetapi ada catatan: karena ULID adalah string 26 karakter, indeks akan lebih besar dibandingkan menggunakan integer. Namun, untuk aplikasi yang memerlukan ID unik di banyak node tanpa auto‑increment, ULID menawarkan kompromi yang baik antara ukuran dan sortability. Beberapa database bahkan mendukung tipe UUID biner (128 bit), yang bisa diisi dengan nilai ULID yang dikonversi.

6. Mengapa ULID hanya menggunakan 26 karakter?
Karena 128 bit di-encode dalam base32. Rumus: ceil(128 / log2(32)) = ceil(128 / 5) = 26. Ini lebih pendek dari UUID dalam base16 (32 karakter) atau base64 (≈22 karakter, tetapi tidak case‑insensitive dan mengandung karakter non‑URL‑safe).