NanoID Generator

Menghasilkan ID unik kecil yang aman untuk URL dengan alfabet yang dapat dikustomisasi

Alfabet

Ukuran

Jumlah

Klik Buat untuk membuat NanoID

Apa itu NanoID?

NanoID adalah generator ID acak yang kecil, cepat, dan URL-safe. Secara default NanoID menghasilkan string 21 karakter menggunakan alfabet 64 karakter (A-Za-z0-9_-), memberikan sekitar 126 bit entropi.

NanoID tidak menyematkan timestamp atau data terstruktur apa pun. Setiap ID sepenuhnya acak, dihasilkan dari cryptographically secure random number generator sistem operasi.

NanoID vs UUID v4

NanoID dan UUID v4 keduanya adalah generator ID acak yang didukung CSPRNG. Mereka berbeda dalam format, panjang, dan dukungan ekosistem:

PropertiNanoID (default)UUID v4
FormatAlfanumerik URL-safe + _-Heksadesimal bertanda hubung
Panjang21 karakter (default)36 karakter
Entropi~126 bit122 bit
URL-safeYa — tidak perlu pengkodeanYa (dengan tanda hubung)
Alfabet64 karakter (A-Za-z0-9_-)16 karakter (0-9a-f)
DependensiMemerlukan paket npmNative (crypto.randomUUID)
Dapat DikustomisasiYa — panjang dan alfabetTidak
StandarTidak ada (library komunitas)RFC 4122 / RFC 9562

Pilih UUID v4 saat interoperabilitas dengan sistem eksternal penting. Pilih NanoID saat Anda ingin ID yang lebih pendek.

Probabilitas Tabrakan berdasarkan Ukuran

Probabilitas tabrakan NanoID bergantung pada panjang ID dan laju pembuatan. Tabel berikut menggunakan alfabet 64 karakter default:

Ukuran (karakter)ID yang mungkinKeamanan tabrakan
664~1 dari 4,5M — aman untuk beberapa ribu ID
864~1 dari 4,5T — aman untuk jutaan ID
1164~1 dari 2,8 kuadriliun — aman untuk miliaran ID
1664~1 dari 1,2 × 10^19 — aman untuk triliunan ID
2164~1 dari 10^30 — aman untuk 100 miliar ID per hari selama berabad-abad
3264Sebanding dengan UUID v4 (122 bit)
3636Melebihi UUID v4

Ukuran 21 karakter default dipilih untuk mencocokkan ketahanan tabrakan UUID v4 (~126 bit) sambil 41% lebih pendek.

Alfabet Kustom

Alfabet NanoID sepenuhnya dapat dikustomisasi. Library menerima string karakter unik apa pun sebagai alfabet:

Hanya numerikA-Za-z0-9_-
Gunakan '0123456789' untuk ID yang semuanya digit — berguna untuk kode SMS atau identifier bergaya PIN.
Hex huruf kecilA-Za-z0-9
Gunakan '0123456789abcdef' untuk string hex kompak tanpa format tanda hubung UUID.
Mudah dibaca manusia0-9a-f
Kecualikan karakter yang ambigu secara visual (0, O, 1, I, l) untuk ID yang mungkin perlu diketik secara manual.
Domain kustom0-9
Gunakan set karakter apa pun yang sesuai untuk aplikasi Anda — misalnya hanya vokal+konsonan untuk ID yang dapat diucapkan.

Penting: gunakan nanoid/non-secure hanya untuk aplikasi yang tidak sensitif keamanan. Untuk ID apa pun yang perlu tidak dapat ditebak, selalu gunakan import aman default.

Cara NanoID Menghasilkan Keacakan

NanoID menggunakan cryptographically secure pseudo-random number generator (CSPRNG) sistem operasi. Di browser ini adalah crypto.getRandomValues(); di Node.js adalah crypto.randomFillSync().

Rejection Sampling (Menghindari Modulo Bias)

Pendekatan naif untuk menghasilkan karakter acak adalah: ambil byte acak (0–255) dan hitung byte % alphabetSize. Ini memperkenalkan modulo bias.

NanoID menghilangkan bias ini menggunakan rejection sampling:

  1. Tentukan mask power-of-two terkecil yang mencakup ukuran alfabet
  2. Hasilkan byte acak dan terapkan mask: byte & mask
  3. Jika nilai yang di-mask berada dalam kisaran alfabet, gunakan. Jika tidak, buang dan coba lagi.

Ini berarti beberapa byte acak dibuang, tetapi hasilnya adalah distribusi yang sempurna seragam di atas alfabet.

How the algorithm works — step by step
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

Dukungan Lingkungan

Browser
Browser modern (Chrome 37+, Firefox 34+, Safari 7+) — menggunakan crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — menggunakan crypto.randomFillSync()
Deno
Deno — menggunakan crypto.getRandomValues()
Bun
React Native — memerlukan polyfill expo-crypto atau react-native-get-random-values
Edge / Cloudflare Workers
Edge runtimes (Cloudflare Workers, Vercel Edge) — Web Crypto API tersedia
React Native
Bun — dukungan crypto native

Contoh Kode

JavaScript / TypeScript

JavaScript
// npm i nanoid
import { nanoid } from 'nanoid'
nanoid()          // → "V1StGXR8_Z5jdHi6B-myT" (21 chars, URL-safe)
nanoid(8)         // → "Uakgb_J5" (custom size)

// Custom alphabet
import { customAlphabet } from 'nanoid'
const hexId  = customAlphabet('0123456789abcdef', 16)
hexId()       // → "4f3a1b8c9d2e0f7a"

const numId  = customAlphabet('0123456789', 8)
numId()       // → "30812894"

Browser (CDN)

NanoID dapat digunakan langsung di browser melalui impor CDN. Tidak diperlukan langkah build untuk prototipe cepat.

JavaScript
// Pure browser — no npm package needed
function generateNanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = crypto.getRandomValues(new Uint8Array(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) {
        id += alphabet[idx]
        if (id.length === size) break
      }
    }
  }
  return id
}

const URL_SAFE = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
generateNanoid(URL_SAFE, 21)  // → "V1StGXR8_Z5jdHi6B-myT"

Python

Python
# pip install nanoid
from nanoid import generate

generate()              # → "V1StGXR8_Z5jdHi6B-myT"
generate(size=8)        # → "Uakgb_J5"
generate('0123456789abcdef', 16)  # custom alphabet + size

Node.js (CommonJS)

JavaScript
// Node.js — stdlib only, no npm needed
const { randomFillSync } = require('crypto')

function nanoid(alphabet, size) {
  const mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  const step = Math.ceil((1.6 * mask * size) / alphabet.length)
  let id = ''
  while (id.length < size) {
    const bytes = randomFillSync(Buffer.alloc(step))
    for (const byte of bytes) {
      const idx = byte & mask
      if (idx < alphabet.length) { id += alphabet[idx]; if (id.length === size) break }
    }
  }
  return id
}

Pertanyaan yang Sering Diajukan

Apakah NanoID aman secara kriptografi?
Ya — saat menggunakan import default, NanoID menghasilkan ID menggunakan CSPRNG tingkat OS.
Bisakah saya menggunakan NanoID sebagai kunci primer database?
Ya. String NanoID URL-safe dan dapat disimpan sebagai kolom CHAR atau VARCHAR.
Bagaimana NanoID dibandingkan dengan crypto.randomUUID()?
Keduanya menggunakan CSPRNG. crypto.randomUUID() bersifat native (tidak ada dependensi), menghasilkan string UUID v4 36 karakter bertanda hubung.
Apa yang terjadi jika saya menggunakan NanoID yang sangat pendek?
ID pendek (misalnya 6–8 karakter) memiliki probabilitas tabrakan yang jauh lebih tinggi.
Bisakah saya menggunakan NanoID di browser tanpa npm?
Ya. NanoID mendukung impor ESM dari CDN (misalnya jsDelivr atau esm.sh).
Apakah NanoID bekerja di semua lingkungan?
NanoID bekerja di semua browser modern, Node.js, Deno, Bun, Cloudflare Workers, dan Vercel Edge Functions.