NanoID Generator

Generate tiny URL-safe unique IDs with customizable alphabet

Alphabet

Größe

Anzahl

Klicken Sie auf Generieren, um NanoIDs zu erstellen

Was ist NanoID?

NanoID ist ein kleiner, schneller, URL-sicherer Zufalls-ID-Generator. Standardmäßig erzeugt er 21-Zeichen-Strings mit einem 64-Zeichen-Alphabet (A-Za-z0-9_-), was ungefähr 126 Bits Entropie bietet — vergleichbar mit UUID v4's 122 Bits, aber in einem kürzeren String.

NanoID enthält keinen Zeitstempel oder strukturierte Daten. Jede ID ist rein zufällig, generiert aus dem kryptografisch sicheren Zufallszahlengenerator des Betriebssystems (crypto.getRandomValues() in Browsern, crypto.randomBytes() in Node.js).

NanoID vs UUID v4

NanoID und UUID v4 sind beide durch einen CSPRNG unterstützte Zufalls-ID-Generatoren. Sie unterscheiden sich in Format, Länge und Ökosystem-Unterstützung:

EigenschaftNanoID (Standard)UUID v4
FormatURL-sicheres alphanumerisches + _-Bindestriche-Hexadezimal
Länge21 Zeichen (Standard)36 Zeichen
Entropie~126 Bits122 Bits
URL-sicherJa — keine Kodierung erforderlichJa (mit Bindestrichen)
Alphabet64 Zeichen (A-Za-z0-9_-)16 Zeichen (0-9a-f)
AbhängigkeitenErfordert npm-PaketNativ (crypto.randomUUID)
AnpassbarJa — Länge und AlphabetNein
StandardKeine (Community-Bibliothek)RFC 4122 / RFC 9562

Wählen Sie UUID v4, wenn Interoperabilität mit externen Systemen wichtig ist — Datenbanken mit nativen UUID-Spalten, APIs, die UUID-Format erwarten, oder Logging-Infrastruktur, die UUIDs parst. Wählen Sie NanoID, wenn Sie kürzere IDs wollen und den gesamten Stack kontrollieren.

Kollisionswahrscheinlichkeit nach Größe

NanoIDs Kollisionswahrscheinlichkeit hängt von der ID-Länge und der Generierungsrate ab. Die folgende Tabelle verwendet das Standard-64-Zeichen-Alphabet:

Größe (Zeichen)Mögliche IDsKollisionssicherheit
664~1 in 4,5 Mrd. — sicher für einige Tausend IDs
864~1 in 4,5 Bio. — sicher für Millionen von IDs
1164~1 in 2,8 Billiarden — sicher für Milliarden von IDs
1664~1 in 1,2 × 10^19 — sicher für Billionen von IDs
2164~1 in 10^30 — sicher für 100 Mrd. IDs pro Tag für Jahrhunderte
3264Vergleichbar mit UUID v4 (122 Bits)
3636Übertrifft UUID v4

Die Standard-21-Zeichen-Größe ist gewählt, um UUID v4's Kollisionsresistenz (~126 Bits) zu entsprechen, während sie 41% kürzer ist. Für die meisten Anwendungen ist 21 Zeichen die richtige Wahl.

Benutzerdefinierte Alphabete

NanoIDs Alphabet ist vollständig anpassbar. Die Bibliothek akzeptiert jeden String eindeutiger Zeichen als Alphabet und generiert IDs nur mit diesen Zeichen:

Nur ZiffernA-Za-z0-9_-
Verwenden Sie '0123456789' für IDs, die nur Ziffern sind — nützlich für SMS-Codes oder PIN-artige Bezeichner.
Kleinbuchstaben-HexA-Za-z0-9
Verwenden Sie '0123456789abcdef' für kompakte Hex-Strings ohne das UUID-Bindestriche-Format.
Menschenlesbar0-9a-f
Schließen Sie visuell mehrdeutige Zeichen aus (0, O, 1, I, l) für IDs, die Benutzer möglicherweise manuell eingeben müssen.
Benutzerdefinierte Domain0-9
Verwenden Sie einen beliebigen Zeichensatz, der für Ihre Anwendung geeignet ist — z. B. nur Vokale+Konsonanten für aussprechbare IDs.

Wichtig: Verwenden Sie nanoid/non-secure nur für nicht sicherheitssensible Anwendungen (z. B. UI-Element-IDs). Für jede ID, die nicht erratbar sein muss, verwenden Sie immer den Standard-sicheren Import.

Wie NanoID Zufälligkeit generiert

NanoID verwendet den kryptografisch sicheren Pseudozufallszahlengenerator (CSPRNG) des Betriebssystems. In Browsern ist das crypto.getRandomValues(); in Node.js ist es crypto.randomFillSync(). Das ist dieselbe Entropiequelle, die für TLS-Sitzungsschlüssel verwendet wird — weit stärker als Math.random().

Rejection-Sampling (Modulo-Verzerrung vermeiden)

Ein naiver Ansatz zur Generierung zufälliger Zeichen wäre: ein zufälliges Byte (0–255) nehmen und byte % alphabetSize berechnen. Das führt zu Modulo-Verzerrung — einige Zeichen erscheinen etwas häufiger als andere, wenn die Alphabetgröße 256 nicht gleichmäßig teilt.

NanoID eliminiert diese Verzerrung durch Rejection-Sampling:

  1. Die kleinste Zweierpotenz-Maske bestimmen, die die Alphabetgröße abdeckt (z. B. für ein 64-Zeichen-Alphabet ist die Maske 63 = 0b00111111)
  2. Zufällige Bytes generieren und die Maske anwenden: byte & mask
  3. Wenn der maskierte Wert im Alphabetbereich liegt, verwenden. Andernfalls verwerfen und erneut versuchen.

Das bedeutet, einige zufällige Bytes werden verworfen, aber das Ergebnis ist eine perfekt gleichmäßige Verteilung über das Alphabet — kein Zeichen ist wahrscheinlicher als ein anderes.

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"

Umgebungsunterstützung

Browser
Moderne Browser (Chrome 37+, Firefox 34+, Safari 7+) — verwendet crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — verwendet crypto.randomFillSync()
Deno
Deno — verwendet crypto.getRandomValues()
Bun
React Native — verwendet expo-crypto oder react-native-get-random-values-Polyfill
Edge / Cloudflare Workers
Edge-Runtimes (Cloudflare Workers, Vercel Edge) — Web Crypto API verfügbar
React Native
Bun — native Crypto-Unterstützung

Code-Beispiele

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 kann direkt im Browser über einen CDN-Import verwendet werden. Kein Build-Schritt für schnelles Prototyping erforderlich.

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
}

Häufig gestellte Fragen

Ist NanoID kryptografisch sicher?
Ja — bei Verwendung des Standard-Imports generiert NanoID IDs mit dem OS-Level-CSPRNG (crypto.getRandomValues in Browsern, crypto.randomFillSync in Node.js). Das ist dieselbe Entropiequelle, die für die kryptografische Schlüsselgenerierung verwendet wird. NanoID-Werte sind für Sitzungs-Token, API-Schlüssel und andere sicherheitssensible Bezeichner geeignet.
Kann ich NanoID als Datenbankprimärschlüssel verwenden?
Ja. NanoID-Strings sind URL-sicher und können als CHAR- oder VARCHAR-Spalten gespeichert werden. NanoID hat jedoch keine Zeitstempelkomponente, sodass IDs nicht nach Generierungsreihenfolge sortierbar sind — das verursacht bei hohen Einfügeraten B-Tree-Index-Fragmentierung, ähnlich wie UUID v4. Für zeitgeordnete Primärschlüssel verwenden Sie ULID oder UUID v7.
Wie vergleicht sich NanoID mit crypto.randomUUID()?
Beide verwenden einen CSPRNG und bieten starke Zufälligkeit. crypto.randomUUID() ist nativ (keine Abhängigkeit), erzeugt 36-Zeichen-Bindestriche-UUID v4-Strings und wird von Datenbanken und APIs universell erkannt. NanoID erfordert ein npm-Paket, erzeugt aber kürzere Strings (standardmäßig 21 Zeichen) mit einem anpassbaren Alphabet. Bevorzugen Sie in den meisten Fällen crypto.randomUUID(), um eine Abhängigkeit zu vermeiden.
Was passiert, wenn ich eine sehr kurze NanoID verwende?
Kurze IDs (z. B. 6–8 Zeichen) haben eine deutlich höhere Kollisionswahrscheinlichkeit. Eine 6-Zeichen-NanoID aus dem Standard-64-Zeichen-Alphabet hat nur ~68 Milliarden mögliche Werte — geeignet für einige Tausend IDs, bevor das Kollisionsrisiko nicht trivial wird. Verwenden Sie die Kollisionswahrscheinlichkeitstabelle oben, um eine geeignete Größe für Ihr erwartetes ID-Volumen zu wählen.
Kann ich NanoID in einem Browser ohne npm verwenden?
Ja. NanoID unterstützt ESM-Imports von CDN (z. B. jsDelivr oder esm.sh). Importieren Sie es als Modul in einem Script-Tag mit type="module". Das ist nützlich für schnelles Prototyping, aber für die Produktion nicht empfohlen — pin Sie auf eine bestimmte Version und erwägen Sie, das Script selbst zu hosten.
Funktioniert NanoID in allen Umgebungen?
NanoID funktioniert in allen modernen Browsern, Node.js, Deno, Bun, Cloudflare Workers und Vercel Edge Functions. Für React Native ist ein Polyfill für getRandomValues erforderlich (react-native-get-random-values). Die Bibliothek ist darauf ausgelegt, umgebungsunabhängig zu sein und erkennt die verfügbare Crypto-API automatisch.