Как сгенерировать хеш-код из трех длин - PullRequest
6 голосов
/ 20 апреля 2011

У меня есть HashMap с координатами в качестве ключей.

Координаты имеют 3 длинных, содержащих координаты x, y и z.(Координата есть и должна быть пользовательским классом, координаты должны быть длинными).

Теперь я хочу иметь доступ к, например, полю [5, 10, 4], выполнив: hashMap.get(new Coordinate(5, 10, 4)).

Я реализовал метод equals, но этого недостаточно, так как, очевидно, мне нужно предоставить реализацию и для hashCode.Итак, мой вопрос как мне сгенерировать уникальный хэш-код из трех длин? .

Дополнительно: использование генератора хеш-функции из внешней библиотеки не вариант.

Ответы [ 4 ]

16 голосов
/ 20 апреля 2011

Джошуа Блох рассказывает вам, как написать equals и hashCode для вашего класса координат в главе 3 его «Эффективной Java».

3 голосов
/ 20 апреля 2011

В Java стандартный метод hashCode() возвращает int, что составляет 32 бита.

Тип данных long составляет 64 бита.Таким образом, три long с означают 192 бита информации, которые, конечно, нельзя однозначно отобразить в 32-битное значение хеш-функции с помощью любой хэш-функции .

Однако HashMapне требует уникального хеширования, он просто обрабатывает коллизии, когда они происходят.

Наивным способом было бы построить строку, то есть "x, y, z", затем хешировать строку.

Вы также можете попробовать просто XOR: объединить значения вместе:

int hashCode()
{
  return (int) (x ^ y ^ z);
}
2 голосов
/ 20 апреля 2011

как мне сгенерировать уникальный хэш-код из трех длин?

Вам не нужно.Хеш-коды не обязательно должны быть уникальными.

1 голос
/ 20 апреля 2011

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

Хеш-код для вашего класса координат вовсе не обязательно должен быть уникальным ...

Хорошее решение для хэш-кода будет:

(int)(x ^ (x >> 32) ^ y ^ (y >> 32) ^ z ^ (z >> 32));

Это XOR двух половинок каждой из длинных XOR-ed вместе.

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