Использование хеша (карты) в качестве ключа в долговременном кеше - PullRequest
0 голосов
/ 29 сентября 2019

Я собираюсь использовать кэш redis, где ключом является карта clojure (сериализована в байты с помощью nippy).

Могу ли я использовать хэш карты clojure в качестве ключа в кэше redis?

Другими словами, зависит ли хеш карты clojure только от значения структуры данных и не зависит от выделения памяти.

Расследование:

Я прошел по коду и нашелout IHashEq интерфейс, который реализуется структурами данных clojure.
В результате IHashEq impl заканчивается вызовом Object.hashCode, который имеет следующий контракт:

Всякий раз, когда он вызываетсяодин и тот же объект более одного раза во время выполнения приложения Java, метод {@code hashCode} должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в {@code equals} сравнениях объекта, не изменяется.
Это целое число не должно оставаться согласованнымот одного выполнения приложения до другого выполнения того же приложения.

Ну, просто хочу уточнить, что я не может использовать хеш в качестве постоянного идентификатора в другом процессе, потому что:

  • два равных значения дают два одинаковых хеш-кода, но не наоборот.Таким образом, существует вероятность столкновения
  • , поэтому нет гарантии, что хеш карты clojure будет одинаковым для одинаковых значений в разных процессах jvm

Пожалуйста, подтвердите.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Вы можете использовать защищенную хеш-библиотеку (например, one ) для решения ваших проблем (как в блокчейне).Хотя вы должны заплатить за его штраф за производительность.

0 голосов
/ 30 сентября 2019

Ваши две точки:

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

  • Разные JVM должны генерировать один и тот же хэш-код для заданного значения, учитывая одну и ту же версию Java и Clojure (и, вероятно, дляразные версии, хотя это не гарантировано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...