Уникальные ключи для Сфинкса по трем векторам вместо двух
Я пытаюсь реализовать интеллектуальный сфинкс на нескольких "сайтах", размещенных в одном приложении 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 в пустой диапазон, который мы только что открыли.