2012-04-29 2 views
1

У меня есть класс, имеющий два метода: getY() и getX() (это своего рода карта).
Домены Y и X [-1000.0, + 1000.0], и они удваиваются.
Я написал метод хэш-код():Как справиться с переполнением в реализации метода hashCode

@Override 
public int hashCode() 
{ 
    int hash=(int) (getX()/EPSILON); 
    hash+= (int) ((1000.0/EPSILON)*getY()); 
    return hash; 
} 

Где Эпсилон максимальная ошибка переносится.
Но проблема в том, что значения слишком велики, и я получаю переполнение, если X = 1000,0 и Y = 1000,0. Как написать метод hashCode(), который обрабатывает переполнение и все еще может возвращать два хеш-кода для двух разных объектов в каждом случае?

+0

Вы в конце концов собираетесь модерировать размер «Карты», чтобы не получить «IndexOutOfBoundsException»? Если это так, вы можете сделать mod где-нибудь в коде, чтобы предотвратить переполнение. – twain249

+0

Почему вы делите 1000 на epsilon (что я предполагаю действительно небольшое число)? – Luciano

+0

Чтобы отличить объекты, имеющие одинаковые целочисленные координаты, но не одинаковые двойные координаты. (0,0,0,0) отличается от (0.0 + EPSILON, 0.0). –

ответ

1

Это, как вы должны сделать это для двойников (см here):

long t = Double.doubleToLongBits(d); 
result = prime * result + (int) (t^(t >>> 32)); 

Для prime использовать низковат простое число, стандартное значение 37.

Initialize result с другим штрихом, дон начинать с нуля. Стандартом для этого является 17.

Это от эффективной Java от Джоша Блоха.

Насколько ваши непосредственные вопросы:

Вы обрабатываете переполнения, игнорируя его. Переполнение приветствуется при вычислении хеш-кода.

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

Смежные вопросы