Подтвердить что ты не робот

Java: нужна хэш-карта, где вы поместите функцию для хэширования

Я хотел бы знать о карте, которая работает как обычный HashMap/Hashtable, за исключением того, что она принимает функцию, которая возвращает хэш-код и выполняет тест равенства, вместо того чтобы позволить HashMap использовать Object.hashCode/equals.

Я не могу использовать TreeMap, потому что объекты не реализуют Comparable, и нет стабильного способа обработки случая с неравными объектами. Нельзя использовать System.identityHashCode, потому что существует вероятность конфликтов для объектов, которые не равны.

В идеале было бы замечательно, если бы Карта применила функцию аналогичным образом, чтобы поставлять собственный Компаратор в TreeMap вместо того, чтобы позволить параметрам листинга TreeMap сопоставляться.

Единственный способ обойти эту проблему - обернуть каждый ключ и сделать обертку обычным хешированием/равным, но, безусловно, лучше.

4b9b3361

Ответ 1

Вы рассматривали простую оболочку вокруг объектов, которые хотите кэшировать?

class Wrapper {
   YourObject object;

   public boolean equals(Object someOther) {
   ...
   }
   public int hashCode() {
   }
}

Ответ 2

При использовании TreeMap объекты на карте не требуются для реализации Comparable.

Ответ 3

Plume-lib WeakHasherMap делает то, что вы хотите: его конструктор принимает в качестве аргумента Hasher, который определяет метод hashCode() и метод equals().

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

Редактировать: я являюсь хранителем plume-lib.

Ответ 4

Я предложил интерфейс для такой "хэш-функции" некоторое время назад.

Теперь вам нужно выполнить любую реализацию хэш-карты (например, OpenJDK - GPL) и изменить все вызовы hashCode() и .equals() с вызовами этого хэш-объекта. Я сделал это один раз (много лет назад), но он не опубликован.