Генерация лексографически восходящих уникальных идентификаторов - PullRequest
2 голосов
/ 02 апреля 2012

Я хочу создать идентификаторы для использования с CouchDB. Мне бы хотелось, чтобы идентификаторы росли по времени по лексографическому признаку, чтобы я мог сортировать по идентификатору, не поддерживая отдельное поле метки времени. Я знаю, что CouchDB будет генерировать идентификаторы с этим свойством, но я не хочу снижения производительности запросов к базе данных, я бы просто запустил алгоритм на своих серверах. Я бы пошел с реализацией rfc 4112 за исключением того, что результаты не лексографически возрастают. Есть ли веская причина, по которой я не должен просто делать:

(Date.now()) + 'x' + Math.round(Math.random() *1E18)

(я использую nodejs). Существуют ли какие-либо затраты на использование нестандартного uuid или использование встроенной случайной функции javascript?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

У вас есть выбор, когда дело доходит до uuids.

Первый вариант - если вы хотите, чтобы сгенерированная _id клиентская сторона (узел, браузер и т. Д.) Или на диване. Похоже, вы хотите создать свой собственный uuid на стороне клиента. Это хорошо. Просто вставьте результат своей функции в поле _id документа, который вы сохраняете в couchdb. Диван будет просто использовать это.

Вы можете создать диван, чтобы создать идентификатор Couchdb генерирует _id, только если вы не выбрали его для себя. Couchdb по умолчанию использует «последовательный» алгоритм генерации uuid. Вы можете изменить алгоритм на другие через футон и конфиг. Есть раздел под названием «uuids» с ключом «алгоритма». Вы можете увидеть источник этих алгоритмов здесь:

https://github.com/apache/couchdb/blob/master/src/couchdb/couch_uuids.erl

С описаниями о них здесь:

http://wiki.apache.org/couchdb/HttpGetUuids?highlight=%28utc%5C_random%29

Как видите, функция utc_random очень похожа на ваше предложение. Но если вы хотите свой собственный, если вы склонны, вы можете добавить свой алгоритм на стороне сервера и перекомпилировать диван.

Вторая часть вашего вопроса касается эффективности выбора различных алгоритмов. Я собираюсь процитировать Дэйва Коттлхубера из сообщения в списке пользователей:

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

Таким образом, и ваш алгоритм, и utc_random должны быть в порядке, поскольку их количество документов постоянно увеличивается, что, по-видимому, полезно в одном направлении времени.

0 голосов
/ 03 апреля 2012

Я бы рекомендовал придерживаться UUID, сгенерированного для вас CouchDB, но вы можете настроить сервер на использование utc_random, который будет префиксом временной метки, по которой вы можете сортировать свои записи.

http://wiki.apache.org/couchdb/HttpGetUuids

...