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:

ÖzellikNanoID (varsayılan)UUID v4
BiçimURL güvenli alfasayısal + _-Tireli onaltılık
Uzunluk21 karakter (varsayılan)36 karakter
Entropi~126 bit122 bit
URL GüvenliEvet — kodlama gerekmezEvet (tirelerle)
Alfabe64 karakter (A-Za-z0-9_-)16 karakter (0-9a-f)
Bağımlılıklarnpm paketi gerektirirYerel (crypto.randomUUID)
ÖzelleştirilebilirEvet — uzunluk ve alfabeHayır
StandartYok (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
664~4,5 milyarda 1 — birkaç bin ID için güvenli
864~4,5 trilyonda 1 — milyonlarca ID için güvenli
1164~2,8 katrilyonda 1 — milyarlarca ID için güvenli
1664~1,2 × 10^19'da 1 — trilyonlarca ID için güvenli
2164~10^30'da 1 — yüzyıllar boyunca günde 100 milyar ID için güvenli
3264UUID v4 (122 bit) ile karşılaştırılabilir
3636UUID 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:

Yalnızca sayısalA-Za-z0-9_-
SMS kodları veya PIN tarzı tanımlayıcılar için tamamen rakamdan oluşan ID'ler için '0123456789' kullanın.
Küçük harf onaltılıkA-Za-z0-9
UUID tire biçimi olmadan kompakt onaltılık dizeler için '0123456789abcdef' kullanın.
İnsan tarafından okunabilir0-9a-f
Kullanıcıların manuel olarak yazması gereken ID'ler için görsel olarak belirsiz karakterleri (0, O, 1, I, l) hariç tutun.
Özel alan0-9
Uygulamanıza uygun herhangi bir karakter kümesi kullanın.

Ö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:

  1. Alfabe boyutunu kapsayan en küçük iki kuvvetli maskeyi belirleyin (ör. 64 karakterli alfabe için maske 63 = 0b00111111'dir)
  2. Rastgele baytlar oluşturun ve maskeyi uygulayın: byte & mask
  3. 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.

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"

Ortam Desteği

Browser
Modern tarayıcılar (Chrome 37+, Firefox 34+, Safari 7+) — crypto.getRandomValues() kullanır
Node.js 14+
Node.js 14.18+ — crypto.randomFillSync() kullanır
Deno
Deno — crypto.getRandomValues() kullanır
Bun
React Native — expo-crypto veya react-native-get-random-values polyfill kullanır
Edge / Cloudflare Workers
Edge çalışma zamanları (Cloudflare Workers, Vercel Edge) — Web Crypto API mevcut
React Native
Bun — yerel şifreleme desteği

Kod Örnekleri

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"

Tarayıcı (CDN)

NanoID, bir CDN içe aktarması aracılığıyla doğrudan tarayıcıda kullanılabilir.

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
}

Sıkça Sorulan Sorular

NanoID kriptografik açıdan güvenli mi?
Evet — varsayılan içe aktarmayı kullanırken NanoID, işletim sistemi düzeyinde CSPRNG kullanarak ID üretir. NanoID değerleri oturum token'ları, API anahtarları ve diğer güvenlik açısından hassas tanımlayıcılar için uygundur.
NanoID'yi veritabanı birincil anahtarı olarak kullanabilir miyim?
Evet. NanoID dizeleri URL güvenlidir ve CHAR veya VARCHAR sütunları olarak depolanabilir. Ancak NanoID'nin zaman damgası bileşeni olmadığından ID'ler oluşturma sırasına göre sıralanabilir değildir.
NanoID, crypto.randomUUID() ile nasıl karşılaştırılır?
Her ikisi de CSPRNG kullanır. crypto.randomUUID() yereldir (bağımlılık yok), 36 karakterli tireli UUID v4 dizeleri üretir. NanoID npm paketi gerektirir ama daha kısa dizeler üretir.
Çok kısa bir NanoID kullanırsam ne olur?
Kısa ID'lerin (ör. 6–8 karakter) çakışma olasılığı önemli ölçüde yüksektir. Uygun boyutu seçmek için yukarıdaki tabloyu kullanın.
NanoID'yi npm olmadan tarayıcıda kullanabilir miyim?
Evet. NanoID, CDN'den (ör. jsDelivr veya esm.sh) ESM içe aktarmalarını destekler. Üretim için belirli bir sürüme sabitleyin.
NanoID tüm ortamlarda çalışır mı?
NanoID tüm modern tarayıcılarda, Node.js'de, Deno'da, Bun'da, Cloudflare Workers'ta ve Vercel Edge Functions'ta çalışır. React Native için getRandomValues polyfill gereklidir.