Использование HiLoIdGenerator в NoRM для MongoDB для создания уникального идентификатора - PullRequest
3 голосов
/ 06 декабря 2010

Я немного боролся с HiLoIdGenerator, который поставляется с NoRM (http://normproject.org/);. Я хочу использовать его для генерации уникального идентификатора, который я могу использовать в качестве SLUG для своих сообщений в блоге. В настоящее время я использую ObjectId для уникальной идентификации документа в MongoDB, но так как он похож на GUID и не очень хорошо выглядит в URL, я бы предпочел иметь что-то вроде www.myblog.com/posts/1243 и поэтому я решили использовать HiLoIdGenerator.

Я хотел бы создать свои идентификаторы HiLo на стороне клиента, и я читаю в блоге Стюарта Харриса http://red -badger.com / Блог / post / A-simple-IRepository3cT3e-реализация-for-MongoDB -and-NoRM.aspx , что Новый генератор HiLo Id NoRM также позволяет это, выделяя диапазон целых чисел для сеанса клиента, который можно использовать безнаказанно (другие клиенты будут использовать другой диапазон) но когда я открыл HiLoIdGenerator, он сказал, что HiLoIdGenerator Класс, который генерирует новое значение идентичности, используя алгоритм HILO. В вашем проекте должен использоваться только один экземпляр этого класса .

У меня действительно есть три вопроса:

1) если бы в моем приложении было несколько экземпляров HiLoIdGenerator (скажем, в моем классе обслуживания был экземпляр, который вызывал GenerateId для каждого нового документа), мог бы я на самом деле гарантировать, что все мои идентификаторы будут уникальными, учитывая, что код для класса HiLoIdGenerator говорит, что в приложении должен быть только один экземпляр этого класса?

2) конструктор HiLoIdGenerator принимает аргумент емкости, и я хотел бы знать, что он делает, я передал 0 и все сгенерированные идентификаторы были одинаковыми, затем я передал 1 новый HiLoIdGenerator (1), с которого начался идентификатор 1 и были увеличены на 1; Я не очень понимаю, что он делает, но я предполагаю, что это как-то связано с диапазоном потенциальных значений, которые может генерировать генератор, но я не уверен, и я бы хотел быть. Может ли кто-нибудь объяснить этот аргумент?

3) Мне кажется, я понимаю цель алгоритма HiLo, как описано здесь Что такое алгоритм Hi / Lo? но я не понимаю, могу ли я иметь два экземпляра MongoDB с двумя разными каждое из приложений смотрит на отдельный экземпляр MongoDB, но оба содержат одинаковые типы коллекций, независимо от того, являются ли сгенерированные идентификаторы глобально уникальными, т. е. могу ли я использовать их так же, как GUID, или они просто уникальны в данном экземпляре MongoDB, следовательно, не допустить слияния обеих коллекций в один экземпляр MongoDB на более позднем этапе?

спасибо

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Смотрите здесь, как создать монотонно увеличивающиеся идентификаторы: http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22

0 голосов
/ 31 марта 2011
  1. Да, они будут уникальными, каждый клиент (HiLoGenerator) будет запрашивать диапазон lo, которые могут быть выделены, но они будут уникальными, если они оба будут использовать одну и ту же емкость

  2. Емкость - это число идентификаторов, которые клиент может безнаказанно назначать, опять же, если у вас есть другая емкость среди клиентов, у вас есть возможность создавать неуникальные значения, если вы используете монотонно увеличивающиеся идентификаторы, то вы - только когда вы назначаете одно последовательное значение, вам не нужен алгоритм HiLo, вам просто нужно одно место, которое содержит значение, которое вы можете увеличивать и назначать новому объекту, см. ответ dm для реализации этой

  3. Да, если оба клиента используют одну и ту же коллекцию, которая содержит значение Hi, и до тех пор, пока оба клиента используют одну и ту же емкость для генерации lo

...