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:
| Properti | NanoID (default) | UUID v4 |
|---|---|---|
| Format | Alfanumerik URL-safe + _- | Heksadesimal bertanda hubung |
| Panjang | 21 karakter (default) | 36 karakter |
| Entropi | ~126 bit | 122 bit |
| URL-safe | Ya — tidak perlu pengkodean | Ya (dengan tanda hubung) |
| Alfabet | 64 karakter (A-Za-z0-9_-) | 16 karakter (0-9a-f) |
| Dependensi | Memerlukan paket npm | Native (crypto.randomUUID) |
| Dapat Dikustomisasi | Ya — panjang dan alfabet | Tidak |
| Standar | Tidak 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 mungkin | Keamanan tabrakan |
|---|---|---|
| 6 | 64 | ~1 dari 4,5M — aman untuk beberapa ribu ID |
| 8 | 64 | ~1 dari 4,5T — aman untuk jutaan ID |
| 11 | 64 | ~1 dari 2,8 kuadriliun — aman untuk miliaran ID |
| 16 | 64 | ~1 dari 1,2 × 10^19 — aman untuk triliunan ID |
| 21 | 64 | ~1 dari 10^30 — aman untuk 100 miliar ID per hari selama berabad-abad |
| 32 | 64 | Sebanding dengan UUID v4 (122 bit) |
| 36 | 36 | Melebihi 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:
A-Za-z0-9_-A-Za-z0-90-9a-f0-9Penting: 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:
- Tentukan mask power-of-two terkecil yang mencakup ukuran alfabet
- Hasilkan byte acak dan terapkan mask:
byte & mask - 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.
// 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
Contoh Kode
JavaScript / TypeScript
// 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.
// 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
# pip install nanoid
from nanoid import generate
generate() # → "V1StGXR8_Z5jdHi6B-myT"
generate(size=8) # → "Uakgb_J5"
generate('0123456789abcdef', 16) # custom alphabet + sizeNode.js (CommonJS)
// 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
}