Перейти до вмісту

Генератор 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), збережена як беззнакове число у форматі big-endian. Вона фіксує час створення 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 не стоїть арифметична формула, на відміну від обчислення відсотка чи відсоткової ставки. Його формують, перетворюючи три числа на шістнадцятковий текст і з’єднуючи їх послідовно:

  1. Візьміть поточний час у секундах від епохи Unix і обмежте його діапазоном від 0 до 4 294 967 295, щоб він вмістився у чотири байти. Запишіть його як шістнадцяткове число з 8 цифр.
  2. Візьміть фіксоване випадкове значення процесу — число від 0 до 2^40 − 1. Запишіть його як шістнадцяткове число з 10 цифр.
  3. Візьміть поточне значення лічильника — від 0 до 16 777 215. Запишіть його як шістнадцяткове число з 6 цифр, а потім збільште лічильник на 1 для наступного ідентифікатора.
  4. Об’єднайте три шістнадцяткові рядки в цьому порядку в один рядок із 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 секунд від епохи Unix, що відповідає 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? Ні. Він повністю працює в браузері й не читає дані з бази даних та не записує їх до неї.

Джерела

  1. "ObjectId." Посібник MongoDB, https://www.mongodb.com/docs/manual/reference/method/ObjectId/.
  2. "ObjectId Specification." Специфікації MongoDB BSON, https://github.com/mongodb/specifications/blob/master/source/bson-objectid/objectid.md.
  3. "BSON Types." Специфікація BSON, https://bsonspec.org/spec.html.