Хэш-код, дающий отрицательные значения
я преобразую входящую строку в хэш-код, выполнив следующую функцию, но некоторые из значений отрицательные. Я не думаю, что значения хэша должны быть отрицательными. Пожалуйста, скажи мне, что я делаю не так.
int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);
3 ответов
Я не думаю, что хэш-значения должны быть отрицательными.
Почему бы и нет? Отрицательные хэш-коды вполне допустимы. Большинство способов создания хэш-кода естественным образом заканчиваются отрицательными значениями, и все, что с ними связано, должно учитывать это. Тем не менее, я бы рассмотрел другой подход к разработке ваших хэш-кодов, например
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
.
иногда hashcode
сам расчет выходит за рамки Integer.MAX_VALUE
, Я.е 2147483647
. что происходит, так это то, что мы получаем отрицательное целое число после overflow
. отрицательный хэш-код является вполне допустимым!
совершенно законно иметь отрицательный хэш-код, и если вы ищете хэш-значения как используется в коллекциях на основе хэша, вы можете использовать Math.abs(hash)
. Это также может дать вам отрицательные числа, когда хэш больше 2^31, и лучшим способом было бы использовать маску сдвига (key.hashCode() & 0x7fffffff) % M
, где M-размер таблицы.