Реализация хэш-кода () в Java - PullRequest
3 голосов
/ 09 ноября 2011

В рекомендациях по написанию хорошего hashCode (), написанного на языке Effective java, автор упоминает следующий шаг, если поле длинное.

Если поле длинное, вычислить (int)(f ^ (f >>> 32)).

Я не могу понять, почему это делается.Почему мы это делаем?

Ответы [ 4 ]

3 голосов
/ 09 ноября 2011

В Java long является 64-разрядным, а int является 32-разрядным.

Так что это просто берет старшие 32 бита и поразрядно-XOR их с младшими 32 битами.

1 голос
/ 09 ноября 2011

Просто чтобы прояснить, вы хэшируете 64-битное значение в 32-битное.Кроме того, хорошая хеш-функция будет производить равномерное распределение значений (по понятным причинам!).

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

Варианты смешивания битов: AND, OR, XOR.Если вы подумаете об этом, AND и OR вообще не будут производить равномерное распределение значений.XOR делает, так что это единственный хороший выбор.

1 голос
/ 09 ноября 2011

Потому что hasCode - это 32-битное целочисленное значение и длинная 64-битная. Вам нужен hashCode, чтобы отличаться для значений с одинаковым младшим 32-битным для каждой длинной, и эта функция должна это гарантировать.

0 голосов
/ 09 ноября 2011

hashCode возвращает int не долго.Хороший алгоритм hashCode пытается получить разные значения для разных входных данных.

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