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.