Подтвердить что ты не робот

HashCode дает отрицательные значения

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

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

Ответ 1

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

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

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.

Ответ 2

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

Ответ 3

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

Ответ 4

Вы можете использовать Math.abs(hash) для создания положительного значения из отрицательного hashcode.