NanoID Üretici
Özelleştirilebilir alfabeyle küçük, URL güvenli benzersiz kimlikler oluşturur
Alfabe
Boyut
Adet
NanoID oluşturmak için Oluştur'a tıklayın
NanoID Nedir?
NanoID, küçük, hızlı, URL güvenli rastgele bir ID oluşturucudur. Varsayılan olarak 64 karakterlik bir alfabe (A-Za-z0-9_-) kullanarak 21 karakterlik dizeler üretir ve yaklaşık 126 bit entropi sağlar — UUID v4'ün 122 bitiyle karşılaştırılabilir ama daha kısa bir dizede.
NanoID bir zaman damgası veya yapısal veri gömmez. Her ID, işletim sisteminin kriptografik açıdan güvenli rastgele sayı oluşturucusundan üretilen tamamen rastgeledir.
NanoID ile UUID v4 Karşılaştırması
NanoID ve UUID v4, her ikisi de CSPRNG destekli rastgele ID oluşturuculardır. Biçim, uzunluk ve ekosistem desteği açısından farklıdırlar:
| Özellik | NanoID (varsayılan) | UUID v4 |
|---|---|---|
| Biçim | URL güvenli alfasayısal + _- | Tireli onaltılık |
| Uzunluk | 21 karakter (varsayılan) | 36 karakter |
| Entropi | ~126 bit | 122 bit |
| URL Güvenli | Evet — kodlama gerekmez | Evet (tirelerle) |
| Alfabe | 64 karakter (A-Za-z0-9_-) | 16 karakter (0-9a-f) |
| Bağımlılıklar | npm paketi gerektirir | Yerel (crypto.randomUUID) |
| Özelleştirilebilir | Evet — uzunluk ve alfabe | Hayır |
| Standart | Yok (topluluk kitaplığı) | RFC 4122 / RFC 9562 |
Dış sistemlerle birlikte çalışabilirlik önemliyse UUID v4'ü seçin. Daha kısa ID'ler istiyorsanız ve tam yığını kontrol ediyorsanız NanoID'yi seçin.
Boyuta Göre Çakışma Olasılığı
NanoID'nin çakışma olasılığı ID uzunluğuna ve oluşturma hızına bağlıdır. Aşağıdaki tablo varsayılan 64 karakterlik alfabeyi kullanır:
| Boyut (karakter) | Olası ID sayısı | Çakışma güvenliği |
|---|---|---|
| 6 | 64 | ~4,5 milyarda 1 — birkaç bin ID için güvenli |
| 8 | 64 | ~4,5 trilyonda 1 — milyonlarca ID için güvenli |
| 11 | 64 | ~2,8 katrilyonda 1 — milyarlarca ID için güvenli |
| 16 | 64 | ~1,2 × 10^19'da 1 — trilyonlarca ID için güvenli |
| 21 | 64 | ~10^30'da 1 — yüzyıllar boyunca günde 100 milyar ID için güvenli |
| 32 | 64 | UUID v4 (122 bit) ile karşılaştırılabilir |
| 36 | 36 | UUID v4'ü aşar |
Varsayılan 21 karakterlik boyut, UUID v4'ün çakışma direnciyle (~126 bit) eşleşecek ancak yüzde 41 daha kısa olacak şekilde seçilmiştir.
Özel Alfabeler
NanoID'nin alfabesi tamamen özelleştirilebilir. Kitaplık, alfabe olarak herhangi bir benzersiz karakter dizesini kabul eder:
A-Za-z0-9_-A-Za-z0-90-9a-f0-9Önemli: nanoid/non-secure'u yalnızca güvenlik açısından hassas olmayan uygulamalar için kullanın. Tahmin edilemez olması gereken her ID için her zaman varsayılan güvenli içe aktarmayı kullanın.
NanoID Rastgeleliği Nasıl Üretir
NanoID, işletim sisteminin kriptografik açıdan güvenli sözde rastgele sayı üreticisini (CSPRNG) kullanır. Tarayıcılarda bu crypto.getRandomValues()'tır; Node.js'de crypto.randomFillSync()'tir.
Reddedilme Örneklemesi (Modülo Sapmasından Kaçınma)
Rastgele karakterler üretmeye yönelik saf yaklaşım: rastgele bir bayt (0–255) alın ve byte % alphabetSize hesaplayın. Bu, bazı karakterlerin diğerlerinden biraz daha sık görünmesine yol açan modülo sapması oluşturur.
NanoID, reddedilme örneklemesi kullanarak bu sapmayı giderir:
- Alfabe boyutunu kapsayan en küçük iki kuvvetli maskeyi belirleyin (ör. 64 karakterli alfabe için maske 63 = 0b00111111'dir)
- Rastgele baytlar oluşturun ve maskeyi uygulayın:
byte & mask - Maskelenmiş değer alfabe aralığındaysa kullanın. Aksi takdirde atın ve tekrar deneyin.
Bu, bazı rastgele baytların atıldığı anlamına gelir, ancak sonuç alfabe üzerinde mükemmel düzgün bir dağılımdır.
// 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"Ortam Desteği
Kod Örnekleri
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"Tarayıcı (CDN)
NanoID, bir CDN içe aktarması aracılığıyla doğrudan tarayıcıda kullanılabilir.
// 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
}