HashCode, дающий отрицательные значения - PullRequest
26 голосов
/ 12 февраля 2012

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

int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);

Ответы [ 3 ]

41 голосов
/ 12 февраля 2012

Я не думаю, что значения хеш-функции должны быть отрицательными.

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

int hash = 17;
hash = hash * 31 + srcadd.hashCode();
hash = hash * 31 + dstadd.hashCode();
hash = hash * 31 + sourceport; // I'm assuming this is an int...
hash = hash * 31 + destinationport; // ditto
hash = hash * 31 + protocol.hashCode();
return hash;

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

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

24 голосов
/ 30 июля 2013

иногда само вычисление hashcode выходит за пределы Integer.MAX_VALUE, т.е. 2147483647. то, что происходит тогда, это то, что мы получаем отрицательное целое число после overflow. Отрицательный хеш-код действителен!

12 голосов
/ 30 ноября 2013

Совершенно законно иметь отрицательные хеш-коды , и если вы ищете хеш-значения , которые используются в коллекциях на основе хеш-функции, вы можете использовать Math.abs(hash). Это также может дать вам отрицательные числа, когда хеш больше 2 ^ 31, и лучший способ - использовать маску сдвига (key.hashCode() & 0x7fffffff) % M, где M - размер таблицы.

...