Как IntelliJ IDEA генерирует хэш-коды? - PullRequest
4 голосов
/ 16 ноября 2011

Вот пример сгенерированного хэш-кода

 @Override
    public int hashCode() {
        int result;
        long temp;
        temp = x != +0.0d ? Double.doubleToLongBits(x) : 0L;
        result = (int) (temp ^ (temp >>> 32));
        temp = y != +0.0d ? Double.doubleToLongBits(y) : 0L;
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        return result;
    }

Интересно, зачем там 31 * и >>> 32

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Для >>> 32: long и double - 64 бита, а int - 32 бита, поэтому для получения результата int, как только должно произойти смещение 32, необходимо сохранить информацию.

Умножение 31 является типичной техникой. 31 - простое число, и повторное умножение в пределах 2 ^ 32 будет повторять все значения. Так что это отлично подходит для хеширования. (В общем)

2 голосов
/ 16 ноября 2011

Следует руководству, описанному в книге «Эффективная Java» (стр. 38):

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

...