Простое решение состоит в том, чтобы просто переписать хэш каждого объекта на карте или какой-нибудь простой его вывод. Поскольку a ^ a = 0
и a ^ b ^ a = b
для всех a и b (xor является коммутативным, ассоциативным и его собственным обратным), а поскольку xor дешев, ваши операции добавления и удаления могут просто xor (возможно, производного) хеш-кода добавленного или удаленный элемент.
Возможно, вы захотите использовать производное хеш-значение, чтобы избежать случаев, когда ваша карта имеет все те же ключи и значения, но некоторые сопоставления между ними транспонируются. Простой производный хеш может быть key.hashCode() - value.hashCode()
, что позволит избежать большинства этих случаев.
Итак, ваш код может выглядеть так:
public class MyMap<K, V> extends HashMap<K, V>{
private int hash = 0;
@Override
public int hashCode() {return hash;}
@Override
public V put(K key, V value) {
V old = super.put(key, value);
if (old != null) this.hash ^= key.hashCode() - old.hashCode();
this.hash ^= key.hashCode() - value.hashCode();
return ret;
}
@Override
public V remove(K key) {
V ret = super.remove(key);
if (ret != null) this.hash ^= key.hashCode() - ret.hashCode();
return ret;
}
}
Обратите внимание, что некоторые из более продвинутых методов (например, добавление нескольких элементов из коллекции) могут быть или не быть безопасными в зависимости от реализации.