Générateur NanoID

Génère des IDs uniques et compacts sûrs pour les URL avec alphabet personnalisable

Alphabet

Taille

Quantité

Cliquez sur Générer pour créer des NanoIDs

Qu'est-ce que NanoID ?

NanoID est un générateur d'identifiants aléatoires tiny, rapide et URL-safe. Par défaut, il produit des chaînes de 21 caractères en utilisant un alphabet de 64 caractères (A-Za-z0-9_-), fournissant environ 126 bits d'entropie — comparable aux 122 bits d'UUID v4 mais dans une chaîne plus courte.

NanoID n'intègre pas d'horodatage ni de données structurées. Chaque identifiant est purement aléatoire, généré à partir du générateur de nombres aléatoires cryptographiquement sécurisé du système d'exploitation (crypto.getRandomValues() dans les navigateurs, crypto.randomBytes() dans Node.js).

NanoID vs UUID v4

NanoID et UUID v4 sont tous deux des générateurs d'identifiants aléatoires soutenus par un CSPRNG. Ils diffèrent dans le format, la longueur et le support de l'écosystème :

PropriétéNanoID (par défaut)UUID v4
FormatAlphanumérique URL-safe + _-Hexadécimal avec tirets
Longueur21 caractères (par défaut)36 caractères
Entropie~126 bits122 bits
URL-safeOui — aucun encodage requisOui (avec tirets)
Alphabet64 caractères (A-Za-z0-9_-)16 caractères (0-9a-f)
DépendancesNécessite un package npmNatif (crypto.randomUUID)
PersonnalisableOui — longueur et alphabetNon
StandardAucun (bibliothèque communautaire)RFC 4122 / RFC 9562

Choisissez UUID v4 quand l'interopérabilité avec des systèmes externes est importante — bases de données avec colonnes UUID natives, API attendant le format UUID ou infrastructure de journalisation qui analyse les UUID. Choisissez NanoID quand vous voulez des identifiants plus courts et contrôlez toute la pile.

Probabilité de collision par taille

La probabilité de collision de NanoID dépend de la longueur de l'identifiant et du taux de génération. Le tableau suivant utilise l'alphabet de 64 caractères par défaut :

Taille (chars)Identifiants possiblesSécurité contre les collisions
664~1 sur 4,5 milliards — sûr pour quelques milliers d'identifiants
864~1 sur 4,5 billions — sûr pour des millions d'identifiants
1164~1 sur 2,8 quadrillions — sûr pour des milliards d'identifiants
1664~1 sur 1,2 × 10^19 — sûr pour des billions d'identifiants
2164~1 sur 10^30 — sûr pour 100 milliards d'identifiants par jour pendant des siècles
3264Comparable à UUID v4 (122 bits)
3636Dépasse UUID v4

La taille par défaut de 21 caractères est choisie pour correspondre à la résistance aux collisions d'UUID v4 (~126 bits) tout en étant 41% plus court. Pour la plupart des applications, 21 caractères est le bon choix.

Alphabets personnalisés

L'alphabet de NanoID est entièrement personnalisable. La bibliothèque accepte n'importe quelle chaîne de caractères uniques comme alphabet et génère des identifiants en utilisant uniquement ces caractères :

Numérique uniquementA-Za-z0-9_-
Utilisez '0123456789' pour des identifiants entièrement numériques — utile pour les codes SMS ou les identifiants de type PIN.
Hexadécimal en minusculesA-Za-z0-9
Utilisez '0123456789abcdef' pour des chaînes hexadécimales compactes sans le format de tirets UUID.
Lisible par l'humain0-9a-f
Excluez les caractères visuellement ambigus (0, O, 1, I, l) pour les identifiants que les utilisateurs pourraient avoir besoin de taper manuellement.
Domaine personnalisé0-9
Utilisez n'importe quel ensemble de caractères approprié à votre application — ex. seulement voyelles+consonnes pour des identifiants prononçables.

Important : utilisez nanoid/non-secure uniquement pour les applications non sensibles à la sécurité (ex. identifiants d'éléments UI). Pour tout identifiant qui doit être impossible à deviner, utilisez toujours l'import sécurisé par défaut.

Comment NanoID génère l'aléatoire

NanoID utilise le générateur de nombres pseudo-aléatoires cryptographiquement sécurisé (CSPRNG) du système d'exploitation. Dans les navigateurs c'est crypto.getRandomValues() ; dans Node.js c'est crypto.randomFillSync(). C'est la même source d'entropie utilisée pour les clés de session TLS — bien plus forte que Math.random().

Échantillonnage par rejet (éviter le biais modulo)

Une approche naïve pour générer des caractères aléatoires serait : prendre un octet aléatoire (0-255) et calculer octet % tailleAlphabet. Cela introduit un biais modulo — certains caractères apparaissent légèrement plus souvent que d'autres quand la taille de l'alphabet ne divise pas 256 uniformément.

NanoID élimine ce biais en utilisant l<strong>échantillonnage par rejet</strong> :

  1. Déterminer le plus petit masque puissance-de-deux qui couvre la taille de l'alphabet (ex. pour un alphabet de 64 chars, le masque est 63 = 0b00111111)
  2. Générer des octets aléatoires et appliquer le masque : octet &amp; masque
  3. Si la valeur masquée est dans la plage de l'alphabet, l'utiliser. Sinon, rejeter et réessayer.

Cela signifie que certains octets aléatoires sont rejetés, mais le résultat est une distribution parfaitement uniforme sur l'alphabet — aucun caractère n'est plus probable qu'un autre.

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"

Support d'environnement

Browser
Navigateurs modernes (Chrome 37+, Firefox 34+, Safari 7+) — utilise crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — utilise crypto.randomFillSync()
Deno
Deno — utilise crypto.getRandomValues()
Bun
React Native — utilise le polyfill expo-crypto ou react-native-get-random-values
Edge / Cloudflare Workers
Runtimes edge (Cloudflare Workers, Vercel Edge) — API Web Crypto disponible
React Native
Bun — support crypto natif

Exemples de code

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"

Navigateur (CDN)

NanoID peut être utilisé directement dans le navigateur via un import CDN. Aucune étape de build requise pour un prototypage rapide.

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
}

Foire Aux Questions

NanoID est-il cryptographiquement sécurisé ?
Oui — lors de l'utilisation de l'import par défaut, NanoID génère des identifiants en utilisant le CSPRNG au niveau OS (crypto.getRandomValues dans les navigateurs, crypto.randomFillSync dans Node.js). C'est la même source d'entropie utilisée pour la génération de clés cryptographiques. Les valeurs NanoID conviennent pour les jetons de session, les clés API et autres identifiants sensibles à la sécurité.
Puis-je utiliser NanoID comme clé primaire de base de données ?
Oui. Les chaînes NanoID sont URL-safe et peuvent être stockées comme colonnes CHAR ou VARCHAR. Cependant, NanoID n'a pas de composant d'horodatage, donc les identifiants ne sont pas triables par ordre de génération — cela causera une fragmentation des index B-tree à des taux d'insertion élevés, similaire à UUID v4. Pour des clés primaires ordonnées dans le temps, utilisez ULID ou UUID v7.
Comment NanoID se compare-t-il à crypto.randomUUID() ?
Les deux utilisent un CSPRNG et fournissent un caractère aléatoire fort. crypto.randomUUID() est natif (aucune dépendance), produit des chaînes UUID v4 avec tirets de 36 caractères et est universellement reconnu par les bases de données et les API. NanoID nécessite un package npm mais produit des chaînes plus courtes (21 chars par défaut) avec un alphabet personnalisable. Pour la plupart des cas, préférez crypto.randomUUID() pour éviter une dépendance.
Que se passe-t-il si j'utilise un NanoID très court ?
Les identifiants courts (ex. 6-8 caractères) ont une probabilité de collision significativement plus élevée. Un NanoID de 6 caractères de l'alphabet de 64 chars par défaut n'a que ~68 milliards de valeurs possibles — adapté à quelques milliers d'identifiants avant que le risque de collision ne devienne non trivial. Utilisez le tableau de probabilité de collision ci-dessus pour choisir une taille appropriée à votre volume d'identifiants attendu.
Puis-je utiliser NanoID dans un navigateur sans npm ?
Oui. NanoID supporte les imports ESM depuis un CDN (ex. jsDelivr ou esm.sh). Importez-le comme module dans une balise script avec type="module". C'est utile pour un prototypage rapide mais pas recommandé pour la production — épinglez à une version spécifique et envisagez d'auto-héberger le script.
NanoID fonctionne-t-il dans tous les environnements ?
NanoID fonctionne dans tous les navigateurs modernes, Node.js, Deno, Bun, Cloudflare Workers et Vercel Edge Functions. Pour React Native, un polyfill pour getRandomValues est requis (react-native-get-random-values). La bibliothèque est conçue pour être agnostique à l'environnement et détecte automatiquement l'API crypto disponible.