NanoID Generator

Generate tiny URL-safe unique IDs with customizable alphabet

Alfabet

Storlek

Antal

Klicka på Generera för att skapa NanoIDs

Vad är NanoID?

NanoID är en liten, snabb, URL-säker slumpmässig ID-generator. Som standard producerar den 21-teckens strängar med ett 64-teckens alfabet (A-Za-z0-9_-), vilket ger ungefär 126 bitar entropi — jämförbart med UUID v4:s 122 bitar men i en kortare sträng.

NanoID bäddar inte in en tidsstämpel eller några strukturerade data. Varje ID är rent slumpmässigt, genererat från operativsystemets kryptografiskt säkra slumptalsalgoritm (crypto.getRandomValues() i webbläsare, crypto.randomBytes() i Node.js).

NanoID vs UUID v4

NanoID och UUID v4 är båda slumpmässiga ID-generatorer som stöds av en CSPRNG. De skiljer sig i format, längd och ekosystemstöd:

EgenskapNanoID (standard)UUID v4
FormatURL-säker alfanumerisk + _-Bindestreck-hexadecimalt
Längd21 tecken (standard)36 tecken
Entropi~126 bitar122 bitar
URL-säkerJa — ingen kodning behövsJa (med bindestreck)
Alfabet64 tecken (A-Za-z0-9_-)16 tecken (0-9a-f)
BeroendenKräver npm-paketInbyggd (crypto.randomUUID)
AnpassningsbarJa — längd och alfabetNej
StandardIngen (gemenskapsbibliotek)RFC 4122 / RFC 9562

Välj UUID v4 när interoperabilitet med externa system spelar roll — databaser med inbyggda UUID-kolumner, API:er som förväntar sig UUID-format eller loggningsinfrastruktur som tolkar UUID:n. Välj NanoID när du vill ha kortare ID:n och kontrollerar hela stacken.

Kollisionssannolikhet efter storlek

NanoID:s kollisionssannolikhet beror på ID-längden och genereringshastigheten. Följande tabell använder standard 64-teckens alfabet:

Storlek (tecken)Möjliga ID:nKollisionssäkerhet
664~1 på 4,5B — säker för några tusen ID:n
864~1 på 4,5B — säker för miljoner ID:n
1164~1 på 2,8 kvadriljoner — säker för miljarder ID:n
1664~1 på 1,2 × 10^19 — säker för biljoner ID:n
2164~1 på 10^30 — säker för 100 miljarder ID:n per dag i århundraden
3264Jämförbar med UUID v4 (122 bitar)
3636Överstiger UUID v4

Standardstorleken 21 tecken är vald för att matcha UUID v4:s kollisionsresistens (~126 bitar) samtidigt som den är 41% kortare. För de flesta applikationer är 21 tecken rätt val.

Anpassade alfabet

NanoID:s alfabet är helt anpassningsbart. Biblioteket accepterar valfri sträng med unika tecken som alfabet och genererar ID:n med bara dessa tecken:

Enbart siffrorA-Za-z0-9_-
Använd '0123456789' för ID:n som enbart består av siffror — användbart för SMS-koder eller PIN-liknande identifierare.
Gemener-hexA-Za-z0-9
Använd '0123456789abcdef' för kompakta hexsträngar utan UUID:s bindestreck-format.
Mänskligt läsbar0-9a-f
Uteslut visuellt tvetydiga tecken (0, O, 1, I, l) för ID:n som användare kan behöva skriva manuellt.
Anpassad domän0-9
Använd valfri uppsättning tecken lämpliga för din applikation — t.ex. bara vokaler+konsonanter för uttalsbara ID:n.

Viktigt: använd nanoid/non-secure bara för icke-säkerhetskänsliga applikationer (t.ex. UI-element-ID:n). För alla ID:n som behöver vara omöjliga att gissa, använd alltid standard säker import.

Hur NanoID genererar slumpmässighet

NanoID använder operativsystemets kryptografiskt säkra pseudoslumpmässiga nummergenerator (CSPRNG). I webbläsare är detta crypto.getRandomValues(); i Node.js är det crypto.randomFillSync(). Det är samma entropikälla som används för TLS-sessionsnycklar — mycket starkare än Math.random().

Avvisningssampling (undvika modulobias)

En naiv metod för att generera slumpmässiga tecken skulle vara: ta en slumpmässig byte (0–255) och beräkna byte % alphabetSize. Det introducerar modulobias — vissa tecken förekommer något oftare än andra när alfabet storleken inte jämnt delar 256.

NanoID eliminerar denna bias med avvisningssampling:

  1. Bestäm den minsta tvåpotensmasken som täcker alfabetstorleken (t.ex. för ett 64-teckens alfabet är masken 63 = 0b00111111)
  2. Generera slumpmässiga bytes och applicera masken: byte & mask
  3. Om det maskerade värdet är inom alfabetets intervall, använd det. Annars, kassera och försök igen.

Det innebär att vissa slumpmässiga bytes kasseras, men resultatet är en perfekt jämn fördelning över alfabetet — inget tecken är mer sannolikt än något annat.

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"

Miljöstöd

Browser
Moderna webbläsare (Chrome 37+, Firefox 34+, Safari 7+) — använder crypto.getRandomValues()
Node.js 14+
Node.js 14.18+ — använder crypto.randomFillSync()
Deno
Deno — använder crypto.getRandomValues()
Bun
React Native — använder expo-crypto eller react-native-get-random-values polyfill
Edge / Cloudflare Workers
Edge-runtimes (Cloudflare Workers, Vercel Edge) — Web Crypto API tillgängligt
React Native
Bun — inbyggt crypto-stöd

Kodexempel

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"

Webbläsare (CDN)

NanoID kan användas direkt i webbläsaren via en CDN-import. Inget byggsteg krävs för snabb prototypframtagning.

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
}

Vanliga frågor

Är NanoID kryptografiskt säkert?
Ja — när du använder standardimporten genererar NanoID ID:n med OS-nivå CSPRNG (crypto.getRandomValues i webbläsare, crypto.randomFillSync i Node.js). Det är samma entropikälla som används för kryptografisk nyckelgenerering. NanoID-värden är lämpliga för sessionstoken, API-nycklar och andra säkerhetskänsliga identifierare.
Kan jag använda NanoID som en databaspriärnyckel?
Ja. NanoID-strängar är URL-säkra och kan lagras som CHAR- eller VARCHAR-kolumner. NanoID har dock ingen tidsstämpelkomponent, så ID:n är inte sorterbara efter genereringsordning — detta orsakar B-tree-indexfragmentering vid höga infogningshastigheter, liknande UUID v4. För tidsordnade primärnycklar, använd ULID eller UUID v7 istället.
Hur jämförs NanoID med crypto.randomUUID()?
Båda använder en CSPRNG och ger stark slumpmässighet. crypto.randomUUID() är inbyggd (inget beroende), producerar 36-teckens bindestreck-UUID v4-strängar och erkänns universellt av databaser och API:er. NanoID kräver ett npm-paket men producerar kortare strängar (21 tecken standard) med ett anpassningsbart alfabet. I de flesta fall, föredra crypto.randomUUID() för att undvika ett beroende.
Vad händer om jag använder ett mycket kort NanoID?
Korta ID:n (t.ex. 6–8 tecken) har betydligt högre kollisionssannolikhet. Ett 6-teckens NanoID från standard 64-teckens alfabet har bara ~68 miljarder möjliga värden — lämpligt för några tusen ID:n innan kollisionsrisken blir icke-trivial. Använd kollisionssannolikhetstabellen ovan för att välja en lämplig storlek för din förväntade ID-volym.
Kan jag använda NanoID i en webbläsare utan npm?
Ja. NanoID stöder ESM-import från CDN (t.ex. jsDelivr eller esm.sh). Importera det som en modul i en script-tagg med type='module'. Det är användbart för snabb prototypframtagning men rekommenderas inte för produktion — fäst vid en specifik version och överväg att själv hosta skriptet.
Fungerar NanoID i alla miljöer?
NanoID fungerar i alla moderna webbläsare, Node.js, Deno, Bun, Cloudflare Workers och Vercel Edge Functions. För React Native krävs en polyfill för getRandomValues (react-native-get-random-values). Biblioteket är utformat för att vara miljöagnostiskt och detekterar automatiskt det tillgängliga crypto-API:et.