NanoID Generator

Generate tiny URL-safe unique IDs with customizable alphabet

Алфавіт

Розмір

Кількість

Натисніть «Згенерувати» для створення NanoID

Що таке NanoID?

NanoID — невелика, безпечна, URL-дружня бібліотека генерації унікальних рядків для JavaScript. Використовує криптографічно захищений генератор випадкових чисел без зовнішніх залежностей.

За замовчуванням NanoID використовує 64-символьний URL-безпечний алфавіт (A-Za-z0-9_-) і генерує ID довжиною 21 символ — ~126 бітів ентропії, порівняно з UUID v4, але компактніше.

NanoID проти UUID

Порівняння NanoID (за замовчуванням) і UUID v4:

ВластивістьNanoID (за замовчуванням)UUID v4
Довжина21 символ36 символів (із дефісами) / 32 (без)
Алфавіт64 символи (A-Za-z0-9_-)16 символів (hex: 0-9a-f)
Біти ентропії~126 бітів122 біти
URL-безпечнийТакТак (лише hex)
СтандартНемає стандартуRFC 4122 / RFC 9562
ДефісиНіТак (формат 8-4-4-4-12)
Нативна підтримка в браузеріНі (потрібен пакет npm)Так (<code>crypto.randomUUID()</code>)
Джерело випадковостіCSPRNG (Web Crypto / Node.js Crypto)CSPRNG (Web Crypto / Node.js Crypto)

Обирайте NanoID для коротших ID і користувацьких алфавітів. UUID v4 — для сумісності зі стандартом.

Розміри та ймовірності колізій

Ймовірність колізії залежить від довжини ID і розміру алфавіту:

РозмірАлфавітБезпека колізій
664~2 на рік
864~6 тисяч років
1164~2 млн років
1664~7 тисяч років
2164~139 років
3264~2 роки
3636~7 годин

Використовуйте калькулятор NanoID для точних ймовірностей.

Користувацькі алфавіти

NanoID підтримує налаштовувані алфавіти:

Лише цифриA-Za-z0-9_-
Для ID, сумісних із застарілими системами. Враховуйте вищі ризики колізій.
Лише рядкові літериA-Za-z0-9
Читабельний нечутливий до регістру алфавіт для кодів користувача.
Безпечний для вимови0-9a-f
Лише легко вимовні приголосні та голосні.
Hex (сумісний з UUID)0-9
Шістнадцятковий формат для UUID-сумісних значень.

Переконайтеся в достатній кількості символів для потрібної безпеки колізій.

Джерело випадковості

NanoID використовує CSPRNG платформи:

Усунення зміщення

Коли алфавіт не є степенем 2, пряме використання випадкових байтів вносить зміщення. NanoID усуває його алгоритмом відхилення.

Алгоритм відхилення NanoID:

  1. Обчислити мінімальну бітову маску для алфавіту.
  2. Генерувати випадкові байти і застосовувати маску.
  3. Прийняти значення лише якщо воно менше розміру алфавіту; інакше — повторити.

Гарантує рівномірний розподіл без зміщення.

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"

Поведінка в різних середовищах

Browser
Node.js: <code>crypto.randomFillSync()</code> для синхронної генерації.
Node.js 14+
Браузери: <code>crypto.getRandomValues()</code> (Web Crypto API).
Deno
Deno: <code>crypto.getRandomValues()</code>.
Bun
React Native: <code>expo-crypto</code> або polyfill.
Edge / Cloudflare Workers
Edge Runtime / Cloudflare Workers: Web Crypto API.
React Native
Unsecure: <code>Math.random()</code> — небезпечно, лише для некритичних випадків.

Приклади коду

JavaScript — Встановлення

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"

Лише браузер (без залежностей)

Реалізація еквівалента NanoID без залежностей:

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 — специфічний синтаксис

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
}

Часті запитання

Чи є NanoID криптографічно безпечним?
Так при стандартних налаштуваннях — використовує CSPRNG платформи. Уникайте варіанту з <code>Math.random()</code>.
Чи можна використовувати NanoID як токен сесії?
Так, при достатній довжині. За замовчуванням 21 символ дає ~126 бітів ентропії. Для відповідальних випадків — 32+ символи.
Наскільки ймовірна колізія NanoID?
При налаштуваннях за замовчуванням (21 символ, алфавіт 64) колізія при 1 млрд ID на годину — близько 1%.
Чи можу я використовувати NanoID в React Native?
Так, з додатковим налаштуванням: пакет <code>react-native-get-random-values</code> або <code>expo-crypto</code>.
NanoID швидший за UUID v4?
Приблизно однаково — обидва використовують той самий CSPRNG платформи.
Чому NanoID використовує 64-символьний алфавіт, а не hex?
Більший алфавіт = більше ентропії на символ: 6 бітів/символ проти 4 для hex. 21 символ NanoID = 126 бітів, на 15 символів коротше UUID.