Требования: уникальность без центральной точки на каждую вставку, высокая скорость, желательно — сортировка по времени создания и компактность, иногда — неугадываемость.
Автоинкремент базы. Просто, компактно, упорядоченно. Минусы: при шардировании нужны разные диапазоны или шаги (auto_increment_offset), генерация привязана к базе (id известен только после вставки), id раскрывают объём бизнеса и позволяют перебирать ресурсы.
Выдача диапазонов. Сервис берёт у базы блок из 1000 номеров (UPDATE seq SET value = value + 1000 RETURNING value) и выдаёт из памяти. Быстро, координация редкая; при падении теряется хвост блока (дырки в последовательности — нормально).
UUIDv4 — 122 случайных бита, генерируется где угодно без координации, вероятность коллизии пренебрежимо мала. Минусы: 16 байт; случайный порядок — каждая вставка в B-дерево индекса попадает в случайную страницу: больше разделений страниц, хуже кэш, больше WAL. На больших таблицах вставка заметно медленнее последовательного ключа.
Упорядоченные по времени:
- Snowflake (Twitter): 64 бита = знак + 41 бит миллисекунд от своей эпохи (~69 лет) + 10 бит номера узла (1024 узла) + 12 бит счётчика в пределах миллисекунды (4096 id). Помещается в bigint, сортируется по времени. Нужно: уникально раздать номера узлов (конфиг, ZooKeeper/etcd, аренда), обработать откат часов (NTP) — ждать или отказывать, если время пошло назад, и переполнение счётчика в миллисекунде — ждать следующую;
- UUIDv7 (RFC 9562, 2024) — 48 бит времени в миллисекундах + версия + случайные биты. Без координации и номеров узлов, почти монотонен, хорош для индексов; поддерживается в PostgreSQL 18 (
uuidv7()) и библиотеках; - ULID, KSUID — похожие идеи с текстовым представлением.
Неугадываемость. Упорядоченные id раскрывают время создания и плотность. Для публичных ссылок — отдельный случайный публичный токен или обфускация, а не опора на секретность id.
Как выбрать: одна база и внутренние id — автоинкремент или bigint identity; распределённая генерация и индексы — UUIDv7 или Snowflake; нужен короткий публичный код — base62 от числа с перемешиванием.