Уникальные ключи для Сфинкса по трем векторам вместо двух

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

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

id * total_models + current_model

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

id, total_models, total_entities

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

Я думал о:

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам