Was ist NanoID?
NanoID erzeugt kompakte, URL-sichere Bezeichner. Voreingestellt sind 21 Zeichen aus einem Alphabet von 64 Zeichen: A-Za-z0-9_-. Das Ergebnis sieht so aus: V1StGXR8_Z5jdHi6B-myT.
Der Reiz liegt im Verhältnis von Länge zu Entropie: 21 Zeichen tragen 126 Bit und damit etwas mehr als die 122 Bit einer UUID v4 - bei 15 Zeichen weniger Platzbedarf und ohne Sonderzeichen, die in URLs kodiert werden müssten.
Der Algorithmus
NanoID zieht Zufallsbytes und bildet sie auf das Alphabet ab. Der wesentliche Punkt ist die Verwerfungsmethode: Werte, die außerhalb eines Vielfachen der Alphabetlänge liegen, werden verworfen statt per Modulo abgebildet.
Das ist kein Detail. Ein einfaches byte % 64 wäre hier zufällig unauffällig, weil 64 die 256 glatt teilt - bei einem Alphabet von 62 Zeichen wären die ersten Zeichen jedoch messbar häufiger. Dieser Generator verwendet durchgehend Verwerfungssampling, unabhängig vom gewählten Alphabet.
NanoID und UUID v4 im Vergleich
Bei Entropie und Zufallsquelle liegen beide gleichauf. Die Unterschiede sind praktisch: NanoID ist kürzer, enthält keine Bindestriche und ist ohne Kodierung URL-sicher. UUID ist standardisiert, hat native Datenbanktypen und wird von Werkzeugen als UUID erkannt.
Als Regel: für interne Datenbankschlüssel UUID, für Bezeichner, die in URLs auftauchen und kurz sein sollen, NanoID.
Alphabet und Länge anpassen
Beide Parameter sind frei wählbar, und sie hängen zusammen: die Entropie beträgt log2(Alphabetlänge) × Länge. Ein Alphabet nur aus Ziffern liefert pro Zeichen 3,32 Bit, das Standardalphabet 6 Bit.
Ein reines Hex- oder Ziffernalphabet ist sinnvoll, wenn Werte in Systeme fließen, die Groß-/Kleinschreibung nicht unterscheiden. Verlängern Sie dann die ID, um die verlorene Entropie auszugleichen.
Typische Einsatzgebiete
NanoID passt für kurze Freigabelinks, Einladungscodes, öffentliche Objekt-IDs in REST-APIs, Dateinamen für Uploads und alles, was Nutzer sehen oder kopieren. Weniger geeignet ist es dort, wo Sortierbarkeit oder ein Entstehungszeitpunkt gebraucht wird.
NanoID in JavaScript und Node.js
Das Paket nanoid ist sehr klein und nutzt in Node crypto.randomFillSync, im Browser crypto.getRandomValues.
import { nanoid, customAlphabet } from 'nanoid';
nanoid(); // 21 Zeichen
nanoid(10); // kürzer
const numeric = customAlphabet('0123456789', 12);
numeric(); // nur Ziffern
Für andere Sprachen gibt es Portierungen unter anderem für Python, Go, Rust, PHP und Java.
Sicherheitshinweise
Drei Punkte sind wichtig: verwenden Sie immer einen CSPRNG und nie Math.random(); kürzen Sie die Länge nur mit Blick auf das erwartete Volumen; und behandeln Sie eine NanoID nicht als Geheimnis, nur weil sie schwer zu erraten ist - für Zugriffsschutz brauchen Sie eine Autorisierungsprüfung, keinen unvorhersagbaren Bezeichner.