Генератор UUID · форматNanoID — короткий идентификатор
NanoID — 21 символ из 64-символьного алфавита A–Z, a–z, 0–9, «_» и «-»: 126 случайных бит — даже чуть больше, чем у UUID v4 (122), — но на 15 символов короче и без кодирования в адресе. Длину и алфавит можно менять — от этого зависит, сколько значений можно выдать без риска совпадения.
Идентификатор в адресе страницы: короткие ссылки, ID документа, приглашения.
Коды, которые видит человек, — с алфавитом без похожих символов.
Не для базы с сортировкой по времени: времени внутри нет, порядок случайный.
Чем отличается от соседей
Против UUID v4: та же или большая случайность при длине 21 вместо 36 и без дефисов, но NanoID — не стандарт, а библиотека, и колонка uuid в базе его не примет. Против ULID: ULID сортируется по времени, NanoID — нет. Укорачивая NanoID, вы уменьшаете запас: 10 символов — это 60 бит, и совпадения становятся реальными на миллиардах значений.
Длиной и статусом. NanoID по умолчанию — 21 символ без дефисов из алфавита, безопасного для адресов, при 126 случайных битах; UUID v4 — 36 символов и 122 бита. Зато UUID — стандарт RFC с типом в базах данных и функциями в языках, а NanoID — библиотека. NanoID удобен в ссылках и на экране, UUID — в схемах и протоколах.
Зависит от того, сколько значений вы выпустите. По калькулятору из документации NanoID при длине 21 и тысяче значений в час до 1 % вероятности совпадения пройдёт около 149 миллиардов лет. Десять символов дают 60 бит — совпадения становятся реальными на миллиардах значений. Короче 12–14 символов делать стоит, только если значений заведомо мало.
Чтобы алфавит был ровно 64 символа и каждый знак нёс шесть бит, а значение не нужно было кодировать в адресе страницы. Это те же символы, что в URL-безопасном варианте Base64. Если «_» и «-» мешают — например, при выделении двойным кликом или в именах файлов, — выберите алфавит только из букв и цифр: длина вырастет на бит-другой.
Нет. Колонка uuid принимает только 32 шестнадцатеричные цифры, а NanoID — строка из другого алфавита и другой длины. Его хранят в текстовой колонке фиксированной длины, например char(21), с уникальным индексом. Если база уже построена на UUID, проще оставить UUID ключом, а NanoID использовать как короткий публичный идентификатор рядом.
Выберите алфавит без похожих символов: в нём нет 0 и O, 1, l и I, которые путают при чтении и вводе руками. Каждый символ несёт чуть меньше бит, поэтому для того же запаса длину стоит увеличить на один-два знака. В самой библиотеке для этого есть customAlphabet — функция, которой передают свой набор знаков.
При полной длине и криптографическом генераторе — да: 126 случайных бит не перебрать, а здесь символы выбираются отбором из crypto.getRandomValues, без перекоса к началу алфавита. Опасность в другом — в укорачивании: шесть-восемь символов перебираются за разумное время. Для ссылок на закрытое держите длину не меньше 21 знака.