Код: Выделить всё
public final int hashCode() {
int result = ...
result = 31 * result + netAmount.hashCode();
result = 31 * result + grossAmount.hashCode();
...
return result;
}
Код: Выделить всё
Double.valueOf("460.4").hashCode() = 639279104
Double.valueOf("-460.4").hashCode() = -1508204544
Double.valueOf("460.4").hashCode() * 2 = 1278558208
Double.valueOf("-460.4").hashCode() * 2 = 1278558208
Код: Выделить всё
31 * (123 + Double.valueOf("460.4").hashCode()) + Double.valueOf("460.4").hashCode() = -1017901339
31 * (123 + Double.valueOf("-460.4").hashCode()) + Double.valueOf("-460.4").hashCode() = -1017901339
Код: Выделить всё
31*123 + 32*Double.valueOf("460.4").hashCode() = -1017901339
31*123 + 32*Double.valueOf("-460.4").hashCode() = -1017901339
Что мне здесь делать, чтобы предотвратить эти столкновения? Просто использовать 37 или какое-то другое число? Добавление хэш-кода сигнума двойника к результату?
edit: Для пояснения: «один лайнер» - это я пытаюсь собрать все строки воедино. в функции hashCode. По сути:
Код: Выделить всё
public final int hashCode() {
int result = 123
result = 31 * result + Double.valueOf("460.4").hashCode();
result = 31 * result + Double.valueOf("460.4").hashCode();
return result;
}
Окончательное редактирование: I меня убедили в любом случае не использовать реализацию hashCode() по умолчанию и использовать что-то вроде хеша Murmur. Не из-за конфликтов, а потому, что я не осознавал, что нет никаких гарантий, что hashcode() вернет одно и то же значение при запуске приложения или даже при обновлении версии jvm. Спасибо за все ответы!
Подробнее здесь: https://stackoverflow.com/questions/790 ... ve-doubles
Мобильная версия