Ответ 1
Обновление январь 2019 года. Как уже упоминалось в комментариях, информация ниже верна вплоть до версии 3.2. Версия 3. 4+ изменила спецификацию, так что идентификатор машины и идентификатор процесса были объединены в одно случайное 5-байтовое значение. Это может затруднить определение источника документа, но также упрощает генерацию и снижает вероятность коллизий.
Оригинальный ответ:
+1 для ответа Серджио, с точки зрения ответа на то, могут ли они быть угаданы или нет, они не являются хэшами, они предсказуемы, поэтому их можно "зверски форсировать" при наличии достаточного времени. Вероятность зависит от того, как были сгенерированы ObjectID и как вы угадываете. Чтобы объяснить, сначала прочитайте спецификацию здесь:
Спецификация идентификатора объекта
Давайте разберем его по частям:
- TimeStamp - полностью предсказуемый, пока у вас есть общее представление о том, когда были сгенерированы данные
- Машина - это хеш MD5 одного из нескольких вариантов, некоторые из которых легче определить, чем другие, но сильно зависят от среды
- PID - опять же, не большое количество значений здесь, и может быть обработано для данных, сгенерированных из известного источника
- Инкремент - если это случайное число, а не инкремент (оба допускаются), то оно менее предсказуемо
Чтобы немного расширить источники. ObjectID могут быть сгенерированы:
- Сам MongoDB (но может быть перенесен, перемещен, обновлен)
- Драйвер (на любой машине, которая вставляет или обновляет данные)
- Ваше приложение (вы можете вручную вставить свой собственный ObjectID, если хотите)
Итак, есть вещи, которые вы можете сделать, чтобы их было сложнее угадать по отдельности, но без большого количества продуманной и надежной защиты, для нормального набора данных, диапазоны действительных идентификаторов ObjectID должны быть достаточно просты для определения, так как все они имеют префикс с timestamp (если вы не манипулируете этим каким-либо образом).