Уникальные ключи для Сфинкса по трем векторам вместо двух - PullRequest
0 голосов
/ 18 декабря 2009

Я пытаюсь реализовать интеллектуальный сфинкс на нескольких «сайтах», размещенных в одном приложении rails. Я работаю с разработчиком мышления-сфинкса, чтобы разобраться в мельчайших деталях, и делаю успехи, но мне нужна помощь с математической задачей:

Обычно формулой для создания уникального идентификатора в поисковом индексе мыслящего сфинкса является получение идентификатора, умножение его на общее количество моделей, доступных для поиска, и добавление номера индексируемой в данный момент модели:

id * total_models + current_model

Это работает хорошо, но теперь я также через entity_id включил в микс, так что есть три вектора для того, чтобы сделать этот идентификатор уникальным. Может ли кто-нибудь помочь мне выяснить уравнение, чтобы гарантировать, что идентификаторы никогда не столкнутся, используя эти три переменные:

id, total_models, total_entities

Идентификатор объекта является целым числом.

Я думал о:

id * (total_models + total_entities) + (current_model + current_entity)

но это приводит к столкновениям.

Любая помощь будет принята с благодарностью:)

1 Ответ

0 голосов
/ 14 апреля 2010

Думаю, я бы убрал эту траву. Был комментарий, который как бы подсказывал, но то, что я в итоге сделал, было немного битфитфингом. Он имеет свои ограничения на количество сущностей, которые вы можете иметь, но в моем примере это 1024 (я думаю), что достаточно для нас:

((primary_key * total_models + current_model_offset) << 10) + entity_id

По сути, мы получаем наше обычное число, смещаем его влево (или вправо) и добавляем entity_id в пустой диапазон, который мы только что открыли.

...