Хэш-код, дающий отрицательные значения

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

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-размер таблицы.