Генератор MongoDB ObjectID - Создание уникальных идентификаторов BSON
Мгновенно генерируйте уникальные идентификаторы MongoDB ObjectID с помощью нашего бесплатного онлайн-инструмента. Создавайте корректные 12-байтовые идентификаторы BSON для тестирования, разработки и операций с базами данных. Не требует установки.
Генератор ObjectID для MongoDB
Документация
Что такое ObjectID MongoDB?
ObjectID MongoDB — это значение размером 12 байт, которое MongoDB по умолчанию присваивает полю _id каждого документа. Оно записывается в виде 24 строчных шестнадцатеричных символов, например 507f1f77bcf86cd799439011. Этот инструмент создаёт от 1 до 100 действительных ObjectID за один раз прямо в браузере, без подключения к базе данных.
Структура ObjectID MongoDB
ObjectID состоит из трёх частей, расположенных последовательно:
- Метка времени (4 байта). Число секунд с 1 января 1970 г. (начала эпохи Unix), сохранённое как беззнаковое число в порядке от старшего байта к младшему. Оно показывает, когда был создан ObjectID. Четыре байта содержат значения от 0 до 4 294 967 295, поэтому после 7 февраля 2106 г., 06:28:15 UTC поле снова принимает значение 0.
- Случайное значение (5 байт). Число, один раз выбранное случайным образом при запуске программы. Все ObjectID, которые эта программа создаёт впоследствии, используют то же случайное значение, поэтому разным компьютерам не требуется согласование.
- Счётчик (3 байта). Число, начинающееся со случайной точки между 0 и 16 777 215 и увеличивающееся на 1 для каждого нового ObjectID. Если оно превышает 16 777 215, счётчик снова принимает значение 0.
В соединённом виде эти части выглядят так:
1timestamp (8 hex chars) + random value (10 hex chars) + counter (6 hex chars) = 24 hex chars
2Старые драйверы MongoDB формировали среднюю часть из идентификатора компьютера и идентификатора процесса, а не из случайного числа. Современные драйверы, включая логику этого инструмента, используют одно случайное значение размером 5 байт для каждого процесса.
Формат и формула ObjectID MongoDB
В основе ObjectID нет арифметической формулы, как в расчёте процента или процентов по вкладу. Он создаётся преобразованием трёх чисел в шестнадцатеричный текст и последовательным объединением полученных частей:
- Возьмите текущее время в секундах с начала эпохи Unix и приведите его к диапазону от 0 до 4 294 967 295, чтобы оно помещалось в четыре байта. Запишите его как 8-значное шестнадцатеричное число.
- Возьмите фиксированное случайное значение процесса — число от 0 до 2^40 − 1. Запишите его как 10-значное шестнадцатеричное число.
- Возьмите текущее значение счётчика от 0 до 16 777 215. Запишите его как 6-значное шестнадцатеричное число, затем увеличьте счётчик на 1 для следующего идентификатора.
- Объедините три шестнадцатеричные строки в указанном порядке в одну строку длиной 24 символа.
Пример расчёта
Предположим, программа запускается в момент времени Unix 1 700 000 000 секунд, то есть 14 ноября 2023 г., 22:13:20 UTC. Она выбирает случайное значение 3f2a91c8d4 и начинает счётчик со значения 12 345.
- Метка времени в шестнадцатеричном виде:
6553f100 - Случайное значение в шестнадцатеричном виде:
3f2a91c8d4 - Счётчик в шестнадцатеричном виде:
003039
При объединении получается первый ObjectID:
6553f1003f2a91c8d4003039
Если программа создаёт второй ObjectID в ту же секунду, метка времени и случайное значение остаются прежними, а счётчик увеличивается до 12 346 (00303a):
6553f1003f2a91c8d400303a
ObjectID можно также прочитать в обратном направлении. В значении 507f1f77bcf86cd799439011 первые 8 символов, 507f1f77, декодируются в 1 350 508 407 секунд с начала эпохи, то есть в 17 октября 2012 г., 21:13:27 UTC.
Распространённые варианты использования ObjectID MongoDB
- Первичные ключи. MongoDB автоматически помещает ObjectID в поле
_idдокумента, если не указано другое значение. - Определение времени создания. Поскольку метка времени встроена в идентификатор, программа может определить приблизительное время создания документа без отдельного поля даты.
- Сортировка по порядку вставки. Сортировка документов по полю
_idприблизительно упорядочивает их по времени создания, поскольку метка времени стоит в начале значения. - Тестовые и имитационные данные. Разработчики используют сгенерированные ObjectID для создания примеров документов или автоматизированных тестов без запуска базы данных.
ObjectID MongoDB и UUID
UUID (универсальный уникальный идентификатор) — это значение размером 16 байт, то есть на четыре байта больше, чем ObjectID. Стандартный UUID обычно полностью случаен, поэтому он не раскрывает время создания и не сортируется в порядке создания. ObjectID короче и приблизительно упорядочен по времени, поэтому MongoDB использует его по умолчанию, хотя он не даёт такой же формальной гарантии уникальности, как правильно сгенерированный UUID.
Часто задаваемые вопросы
Для чего используется ObjectID MongoDB?
Это значение по умолчанию, которое MongoDB помещает в поле _id документа, поэтому каждый документ получает уникальный ключ без дополнительной настройки.
Гарантирована ли уникальность ObjectID MongoDB? В формальном математическом смысле — нет, но вероятность коллизий чрезвычайно мала. Для совпадения двух ObjectID должны совпасть случайное значение и положение счётчика в одну и ту же секунду, что обычно возможно только внутри одного процесса.
Можно ли определить дату создания по ObjectID? Да. Первые 8 шестнадцатеричных символов, то есть 4 байта, содержат число секунд с начала эпохи Unix. Преобразование этого числа в дату даёт приблизительное время создания.
Сколько ObjectID этот генератор может создать за один раз? От 1 до 100 за один пакет. Все идентификаторы в пакете используют одно и то же случайное значение процесса, а значение счётчика каждого следующего идентификатора на единицу больше предыдущего.
Можно ли использовать ObjectID MongoDB за пределами MongoDB? Да. Поскольку это всего лишь значения размером 12 байт, закодированные в виде шестнадцатеричного текста, они подходят и как уникальные идентификаторы в других системах, хотя собственная схема идентификаторов базы данных может лучше соответствовать её задачам.
Подключён ли этот генератор к настоящей базе данных MongoDB? Нет. Он полностью работает в браузере и не читает данные из базы данных и не записывает их в неё.
Источники
- "ObjectId." Руководство MongoDB, https://www.mongodb.com/docs/manual/reference/method/ObjectId/.
- "ObjectId Specification." Спецификации MongoDB BSON, https://github.com/mongodb/specifications/blob/master/source/bson-objectid/objectid.md.
- "BSON Types." Спецификация BSON, https://bsonspec.org/spec.html.