NanoID Generator

Generate tiny URL-safe unique IDs with customizable alphabet

Alfabet

Grootte

Aantal

Klik op Genereren om NanoIDs te maken

Wat is NanoID?

NanoID is een kleine, snelle, URL-veilige willekeurige ID-generator. Standaard produceert het 21-teken strings met een 64-teken alfabet (A-Za-z0-9_-), wat ongeveer 126 bits entropie biedt — vergelijkbaar met UUID v4's 122 bits maar in een kortere string.

NanoID bevat geen tijdstempel of gestructureerde gegevens. Elke ID is puur willekeurig, gegenereerd uit de cryptografisch veilige willekeurige getallengenerator van het besturingssysteem (crypto.getRandomValues() in browsers, crypto.randomBytes() in Node.js).

NanoID vs UUID v4

NanoID en UUID v4 zijn beide willekeurige ID-generators ondersteund door een CSPRNG. Ze verschillen in formaat, lengte en ecosysteemondersteuning:

EigenschapNanoID (standaard)UUID v4
FormaatURL-veilig alfanumeriek + _-Koppeltekens-hexadecimaal
Lengte21 tekens (standaard)36 tekens
Entropie~126 bits122 bits
URL-veiligJa — geen codering vereistJa (met koppeltekens)
Alfabet64 tekens (A-Za-z0-9_-)16 tekens (0-9a-f)
AfhankelijkhedenVereist npm-pakketNative (crypto.randomUUID)
AanpasbaarJa — lengte en alfabetNee
StandaardGeen (community-bibliotheek)RFC 4122 / RFC 9562

Kies UUID v4 wanneer interoperabiliteit met externe systemen van belang is — databases met native UUID-kolommen, API's die UUID-formaat verwachten, of logging-infrastructuur die UUIDs parseert. Kies NanoID wanneer u kortere ID's wilt en de volledige stack beheert.

Botsingskans per grootte

NanoIDs botsingskans hangt af van de ID-lengte en de generatiesnelheid. De volgende tabel gebruikt het standaard 64-teken alfabet:

Grootte (tekens)Mogelijke ID'sBotsingsveiligheid
664~1 op 4,5 miljard — veilig voor een paar duizend ID's
864~1 op 4,5 biljoen — veilig voor miljoenen ID's
1164~1 op 2,8 biljard — veilig voor miljarden ID's
1664~1 op 1,2 × 10^19 — veilig voor biljoenen ID's
2164~1 op 10^30 — veilig voor 100 miljard ID's per dag gedurende eeuwen
3264Vergelijkbaar met UUID v4 (122 bits)
3636Overtreft UUID v4

De standaard 21-teken grootte is gekozen om overeen te komen met UUID v4's botsingsbestendigheid (~126 bits) terwijl het 41% korter is. Voor de meeste toepassingen is 21 tekens de juiste keuze.

Aangepaste alfabetten

NanoIDs alfabet is volledig aanpasbaar. De bibliotheek accepteert elke string van unieke tekens als het alfabet en genereert ID's met alleen die tekens:

Alleen cijfersA-Za-z0-9_-
Gebruik '0123456789' voor ID's die alleen cijfers zijn — handig voor SMS-codes of PIN-achtige identificatoren.
Kleine letters hexadecimaalA-Za-z0-9
Gebruik '0123456789abcdef' voor compacte hexadecimale strings zonder het UUID koppeltekens-formaat.
Mensleesbaar0-9a-f
Sluit visueel dubbelzinnige tekens uit (0, O, 1, I, l) voor ID's die gebruikers mogelijk handmatig moeten typen.
Aangepast domein0-9
Gebruik een willekeurige set tekens die geschikt is voor uw toepassing — bijv. alleen klinkers+medeklinkers voor uitsprekbare ID's.

Belangrijk: gebruik nanoid/non-secure alleen voor niet-beveiligingsgevoelige toepassingen (bijv. UI-element-ID's). Voor elke ID die onraadbaar moet zijn, gebruik altijd de standaard veilige import.

Hoe NanoID willekeurigheid genereert

NanoID gebruikt de cryptografisch veilige pseudo-willekeurige getallengenerator (CSPRNG) van het besturingssysteem. In browsers is dat crypto.getRandomValues(); in Node.js is het crypto.randomFillSync(). Dit is dezelfde entropiebron die wordt gebruikt voor TLS-sessiesleutels — veel sterker dan Math.random().

Rejection-sampling (modulo-bias vermijden)

Een naïeve aanpak voor het genereren van willekeurige tekens zou zijn: neem een willekeurig byte (0–255) en bereken byte % alphabetSize. Dit introduceert modulo-bias — sommige tekens komen iets vaker voor dan andere wanneer de alfabetgrootte 256 niet gelijkmatig deelt.

NanoID elimineert deze bias met rejection-sampling:

  1. Bepaal het kleinste macht-van-twee-masker dat de alfabetgrootte dekt (bijv. voor een 64-teken alfabet is het masker 63 = 0b00111111)
  2. Genereer willekeurige bytes en pas het masker toe: byte & mask
  3. Als de gemaskeerde waarde binnen het alfabetbereik valt, gebruik die. Anders verwerpen en opnieuw proberen.

Dit betekent dat sommige willekeurige bytes worden verworpen, maar het resultaat is een perfect uniforme verdeling over het alfabet — geen teken is waarschijnlijker dan een ander.

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"

Omgevingsondersteuning

Browser
Moderne browsers (Chrome 37+, Firefox 34+, Safari 7+) — gebruikt crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — gebruikt crypto.randomFillSync()
Deno
Deno — gebruikt crypto.getRandomValues()
Bun
React Native — gebruikt expo-crypto of react-native-get-random-values polyfill
Edge / Cloudflare Workers
Edge-runtimes (Cloudflare Workers, Vercel Edge) — Web Crypto API beschikbaar
React Native
Bun — native crypto-ondersteuning

Codevoorbeelden

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 kan direct in de browser worden gebruikt via een CDN-import. Geen build-stap vereist voor snel prototypen.

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
}

Veelgestelde vragen

Is NanoID cryptografisch veilig?
Ja — bij gebruik van de standaard import genereert NanoID ID's met de OS-niveau CSPRNG (crypto.getRandomValues in browsers, crypto.randomFillSync in Node.js). Dit is dezelfde entropiebron die wordt gebruikt voor cryptografische sleutelgeneratie. NanoID-waarden zijn geschikt voor sessietokens, API-sleutels en andere beveiligingsgevoelige identificatoren.
Kan ik NanoID gebruiken als database primaire sleutel?
Ja. NanoID-strings zijn URL-veilig en kunnen worden opgeslagen als CHAR- of VARCHAR-kolommen. NanoID heeft echter geen tijdstempelcomponent, dus ID's zijn niet sorteerbaar op generatievolgorde — dit veroorzaakt B-tree-indexfragmentatie bij hoge invoegsnelheden, vergelijkbaar met UUID v4. Voor tijdgeordende primaire sleutels gebruik ULID of UUID v7.
Hoe vergelijkt NanoID met crypto.randomUUID()?
Beide gebruiken een CSPRNG en bieden sterke willekeurigheid. crypto.randomUUID() is native (geen afhankelijkheid), produceert 36-teken koppeltekens-UUID v4-strings en wordt universeel herkend door databases en API's. NanoID vereist een npm-pakket maar produceert kortere strings (standaard 21 tekens) met een aanpasbaar alfabet. Geef voor de meeste gevallen de voorkeur aan crypto.randomUUID() om een afhankelijkheid te vermijden.
Wat gebeurt er als ik een zeer korte NanoID gebruik?
Korte ID's (bijv. 6–8 tekens) hebben een aanzienlijk hogere botsingskans. Een 6-teken NanoID uit het standaard 64-teken alfabet heeft slechts ~68 miljard mogelijke waarden — geschikt voor een paar duizend ID's voordat het botsingsrisico niet-triviaal wordt. Gebruik de botsingskans tabel hierboven om een geschikte grootte te kiezen voor uw verwacht ID-volume.
Kan ik NanoID in een browser gebruiken zonder npm?
Ja. NanoID ondersteunt ESM-imports van CDN (bijv. jsDelivr of esm.sh). Importeer het als een module in een script-tag met type="module". Dit is nuttig voor snel prototypen maar niet aanbevolen voor productie — pin aan een specifieke versie en overweeg het script zelf te hosten.
Werkt NanoID in alle omgevingen?
NanoID werkt in alle moderne browsers, Node.js, Deno, Bun, Cloudflare Workers en Vercel Edge Functions. Voor React Native is een polyfill voor getRandomValues vereist (react-native-get-random-values). De bibliotheek is ontworpen om omgevingsonafhankelijk te zijn en detecteert automatisch de beschikbare crypto-API.