NanoID Generator

Generate tiny URL-safe unique IDs with customizable alphabet

Abeceda

Velikost

Počet

Klikněte na Generovat pro vytvoření NanoID

Co je NanoID?

NanoID je malý, rychlý, URL-bezpečný generátor náhodných ID. Ve výchozím nastavení produkuje 21znakové řetězce pomocí 64znakové abecedy (A-Za-z0-9_-), čímž poskytuje přibližně 126 bitů entropie — srovnatelné s 122 bity UUID v4, ale v kratším řetězci.

NanoID nevkládá časové razítko ani žádná strukturovaná data. Každé ID je čistě náhodné, generované z kryptograficky bezpečného generátoru náhodných čísel operačního systému (crypto.getRandomValues() v prohlížečích, crypto.randomBytes() v Node.js).

NanoID vs UUID v4

NanoID a UUID v4 jsou oba generátory náhodných ID podporované CSPRNG. Liší se ve formátu, délce a podpoře ekosystému:

VlastnostNanoID (výchozí)UUID v4
FormátURL-bezpečné alfanumerické + _-Hexadecimální s pomlčkami
Délka21 znaků (výchozí)36 znaků
Entropie~126 bitů122 bitů
URL-bezpečnéAno — není potřeba kódováníAno (s pomlčkami)
Abeceda64 znaků (A-Za-z0-9_-)16 znaků (0-9a-f)
ZávislostiVyžaduje balíček npmNativní (crypto.randomUUID)
PřizpůsobitelnéAno — délka a abecedaNe
StandardŽádný (komunitní knihovna)RFC 4122 / RFC 9562

Zvolte UUID v4, když záleží na interoperabilitě s externími systémy — databáze s nativními sloupci UUID, API očekávající formát UUID nebo logovací infrastruktura, která parsuje UUID. Zvolte NanoID, když chcete kratší ID a ovládáte celý stack.

Pravděpodobnost kolize podle velikosti

Pravděpodobnost kolize NanoID závisí na délce ID a rychlosti generování. Následující tabulka používá výchozí 64znakovou abecedu:

Velikost (znaky)Možná IDBezpečnost kolize
664~1 z 4,5B — bezpečné pro několik tisíc ID
864~1 z 4,5B — bezpečné pro miliony ID
1164~1 z 2,8 kvadrilionu — bezpečné pro miliardy ID
1664~1 z 1,2 × 10^19 — bezpečné pro biliony ID
2164~1 z 10^30 — bezpečné pro 100 miliard ID denně po staletí
3264Srovnatelné s UUID v4 (122 bitů)
3636Překračuje UUID v4

Výchozí velikost 21 znaků je zvolena tak, aby odpovídala odolnosti UUID v4 vůči kolizím (~126 bitů) při délce o 41 % kratší. Pro většinu aplikací je 21 znaků správnou volbou.

Vlastní abecedy

Abeceda NanoID je plně přizpůsobitelná. Knihovna přijímá libovolný řetězec unikátních znaků jako abecedu a generuje ID pouze pomocí těchto znaků:

Pouze čísliceA-Za-z0-9_-
Použijte '0123456789' pro ID tvořená pouze číslicemi — užitečné pro SMS kódy nebo identifikátory ve stylu PIN.
Malá písmena hexA-Za-z0-9
Použijte '0123456789abcdef' pro kompaktní hex řetězce bez formátu UUID s pomlčkami.
Čitelné pro člověka0-9a-f
Vyloučte vizuálně nejednoznačné znaky (0, O, 1, I, l) pro ID, která mohou uživatelé potřebovat zadávat ručně.
Vlastní doména0-9
Použijte libovolnou sadu znaků vhodnou pro vaši aplikaci — např. pouze samohlásky+souhlásky pro vyslovitelná ID.

Důležité: používejte nanoid/non-secure pouze pro aplikace nesensitivní na zabezpečení (např. ID prvků uživatelského rozhraní). Pro jakékoliv ID, které musí být neuhádnutelné, vždy používejte výchozí bezpečný import.

Jak NanoID generuje náhodnost

NanoID používá kryptograficky bezpečný pseudonáhodný generátor čísel (CSPRNG) operačního systému. V prohlížečích je to crypto.getRandomValues(); v Node.js je to crypto.randomFillSync(). Toto je stejný zdroj entropie používaný pro klíče relace TLS — mnohem silnější než Math.random().

Odmítnutí vzorkování (vyhýbání se modulo bias)

Naivní přístup ke generování náhodných znaků by byl: vezměte náhodný bajt (0–255) a vypočítejte byte % alphabetSize. To zavádí modulo bias — některé znaky se vyskytují o něco častěji než jiné, když velikost abecedy nerozděluje 256 rovnoměrně.

NanoID eliminuje tuto bias pomocí odmítnutí vzorkování:

  1. Určete nejmenší masku mocniny dvou, která pokrývá velikost abecedy (např. pro abecedu 64 znaků je maska 63 = 0b00111111)
  2. Vygenerujte náhodné bajty a aplikujte masku: byte & mask
  3. Pokud je maskovaná hodnota v rozsahu abecedy, použijte ji. Jinak zahoďte a zkuste znovu.

To znamená, že některé náhodné bajty jsou zahozeny, ale výsledkem je perfektně rovnoměrné rozdělení přes abecedu — žádný znak není pravděpodobnější než jiný.

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"

Podpora prostředí

Browser
Moderní prohlížeče (Chrome 37+, Firefox 34+, Safari 7+) — používá crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — používá crypto.randomFillSync()
Deno
Deno — používá crypto.getRandomValues()
Bun
React Native — používá polyfill expo-crypto nebo react-native-get-random-values
Edge / Cloudflare Workers
Edge runtime prostředí (Cloudflare Workers, Vercel Edge) — dostupné Web Crypto API
React Native
Bun — nativní podpora crypto

Příklady kódu

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"

Prohlížeč (CDN)

NanoID lze použít přímo v prohlížeči prostřednictvím importu CDN. Není potřeba žádný krok sestavení pro rychlé prototypování.

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
}

Časté dotazy

Je NanoID kryptograficky bezpečné?
Ano — při použití výchozího importu generuje NanoID ID pomocí CSPRNG na úrovni OS (crypto.getRandomValues v prohlížečích, crypto.randomFillSync v Node.js). Toto je stejný zdroj entropie používaný pro generování kryptografických klíčů. Hodnoty NanoID jsou vhodné pro tokeny relací, API klíče a další bezpečnostně citlivé identifikátory.
Mohu použít NanoID jako primární klíč databáze?
Ano. Řetězce NanoID jsou URL-bezpečné a mohou být uloženy jako sloupce CHAR nebo VARCHAR. NanoID však nemá časovou komponentu, takže ID nejsou seřaditelná podle pořadí generování — to způsobí fragmentaci B-tree indexu při vysokých rychlostech vkládání, podobně jako UUID v4. Pro časově uspořádané primární klíče místo toho použijte ULID nebo UUID v7.
Jak se NanoID srovnává s crypto.randomUUID()?
Oba používají CSPRNG a poskytují silnou náhodnost. crypto.randomUUID() je nativní (žádná závislost), produkuje 36znakové řetězce UUID v4 s pomlčkami a je univerzálně rozpoznáváno databázemi a API. NanoID vyžaduje balíček npm, ale produkuje kratší řetězce (výchozí 21 znaků) s přizpůsobitelnou abecedou. Ve většině případů preferujte crypto.randomUUID() pro vyhnutí se závislosti.
Co se stane, pokud použiji velmi krátké NanoID?
Krátká ID (např. 6–8 znaků) mají výrazně vyšší pravděpodobnost kolize. 6znakové NanoID z výchozí 64znakové abecedy má pouze ~68 miliard možných hodnot — vhodné pro několik tisíc ID, než se riziko kolize stane netriviálním. Pro výběr vhodné velikosti pro váš očekávaný objem ID použijte tabulku pravděpodobnosti kolize výše.
Mohu NanoID použít v prohlížeči bez npm?
Ano. NanoID podporuje importy ESM z CDN (např. jsDelivr nebo esm.sh). Importujte ho jako modul v tagu script s type="module". To je užitečné pro rychlé prototypování, ale nedoporučuje se pro produkci — připněte ke konkrétní verzi a zvažte vlastní hostování skriptu.
Funguje NanoID ve všech prostředích?
NanoID funguje ve všech moderních prohlížečích, Node.js, Deno, Bun, Cloudflare Workers a Vercel Edge Functions. Pro React Native je potřeba polyfill pro getRandomValues (react-native-get-random-values). Knihovna je navržena tak, aby byla prostředí-agnostická a automaticky detekuje dostupné crypto API.