НЕ требуется, чтобы hashCode
давал одинаковые значения в разных JVM.Например, класс HashMap
не сохраняет значения hashCode
ключей карты при сериализации.Вместо этого значения hashCode
пересчитываются при десериализации карты.
Единственная потенциальная проблема, которую я вижу, состоит в том, что пересчет hashCode
для каждого вызова неэффективен.Вы можете решить эту проблему, вычисляя его лениво (как, например, String::hashCode
).
Но если вы реализуете ленивый hashCode
расчет, вам потребуется , чтобы объявить поле, в котором вы его хранитекак transient
.В противном случае значение hashCode
в экземпляре с удаленным ключом не будет ==
значением hashCode
, вычисленным для другого экземпляра, который "равен" ключу.(Другими словами, контракт хэш-кода / равно не работает!) Это приведет к ошибке поиска.
Если вы сделаете это правильно, не должно быть проблем с сериализацией HashMap
.Например, вы можете использовать подход String::hashCode
и использовать ноль в качестве кэшированного значения hashCode
, что означает «код должен быть рассчитан» для метода hashCode()
.
(ЕслиВаш ключевой класс не имеет поля для хранения кэшированного значения hashCode
, проблема с сохранением этого значения не возникает.)
Еще одна вещь, на которую следует обратить внимание: модификация класса ключей для реализации Comparable
будет еще одной защитой от атак на DOS.В вашем примере класса реализация метода compareTo
проста.Обратите внимание, что порядок, который вы реализуете, не должен быть семантически значимым.Он просто должен быть стабильным и последовательным.