2013-04-23 3 views
10

Автогенерированный идентификатор BSON, который хранится в поле _id каждого документа, является ли он идентификатором GUID? В документации говорится, что он «скорее всего уникален», поэтому я немного смущен. Почему они используют идентификатор, который не гарантированно уникален?Являются ли идентификаторы GUID Mongodb ObjectIds?

+1

гарантированно будет уникальным, по крайней мере, я никогда не видел реального столкновения. Существует много документации о том, что именно закодировано. –

+1

Даже GUID не гарантирует его уникальность, но так, как они формируются, они, вероятно, будут уникальными все время. – Devesh

ответ

3

Он уникален в большинстве требований и состоит из отметки времени, уникального идентификатора машины (хеш машинного узла), идентификатора процесса и последнего номера инкремента. http://docs.mongodb.org/manual/reference/object-id/

0

ObjectId поясняется в документе here. Это не «гарантировано», чтобы быть уникальным, потому что MongoDB не обеспечивает уникальность, чтобы сэкономить время. Он просто полагает, что алгоритм сложного генерации, вероятно, никогда не будет создавать два идентичных объекта ObjectIds в одном хранилище данных. Так что технически это не GUID, но в значительной степени хороший.

6

Его единство основано на вероятности. В отличие от @mattexx Ответ:

Это не «гарантировано», чтобы быть уникальным, потому что MongoDB не обеспечивает уникальность, чтобы сэкономить время.

MongoDB НЕ применять uniqness на ObjectId, это на самом деле имеет уникальный индекс на _id поле. Говоря о сбережении времени, ObjectId является историческим, так как он был разработан в те дни, когда MongoDB не делал никаких записей и нуждался в 99% вероятности вставить новую уникальную запись без клиента, ожидающего ack (ObjectIds создаются с клиентской стороны).

Они не являются GUID, однако они, как говорит Ася, гарантируют высокий уровень юнилинга.

До тех пор, пока время не перемещается назад, вероятность 99% будет уникальной навсегда. Хорошо, как говорит @Devesh, есть 1, 1 триллион («не сделали математику»), шанс дублирования GUID, но, опять же, я не думаю, что вы скоро достигнете этой вероятности.

1

Вероятность столкновения ID составляет теоретически достаточно близко к нулю, что можно предположить для типичных веб-приложений. Многие системы реального мира (Mongo или нет) полагаются на это свойство GUID, хотя это не будет хорошим предположением для систем безопасности/критически важных систем.

В терминах практических существуют действительно сценарии, где это может пойти не так, если есть неправильная конфигурация или ошибка библиотеки сторонних разработчиков. Те не должны исключать эту концепцию, но важно знать об этих рисках и избегать их там, где это возможно.

Некоторые вопросы good analysis here практических вопросов, которые могут вызвать столкновение. В частности:

Некоторые монгольские драйверы используют случайные числа вместо увеличивающихся чисел для счетчиков байтов. В этих случаях существует вероятность получения уникального идентификатора 1/16,777,216, но только если эти два идентификатора генерируются за одну секунду (т. Е. До временного раздела обновлений ID до следующей секунды), на том же машины, в том же процессе.

Смежные вопросы