hashCode dando valores negativos


Estoy convirtiendo la cadena entrante en código hash haciendo la siguiente función, pero algunos de los valores son negativos. No creo que los valores hash deban ser negativos. Por favor, dime qué estoy haciendo mal.

int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);
Author: Whymarrh, 2012-02-12

3 answers

No creo que los valores hash deban ser negativos.

¿Por qué no? Es totalmente válido tener códigos hash negativos. La mayoría de las formas de llegar a un código hash terminan naturalmente con valores negativos, y cualquier cosa que trate con ellos debe tener en cuenta esto. Sin embargo, consideraría un enfoque diferente para llegar a sus códigos hash, por ejemplo,

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;

No está claro cuáles son los tipos de estas expresiones, pero supongo que estás terminando tomando el código hash de un cadena... una cadena que no necesitas crear en primer lugar. Si bien hay mejores enfoques para obtener códigos hash para dominios conocidos, el enfoque anterior funciona bien como una técnica de generación de hash de propósito general.

Tenga en cuenta que también ayudaría a la legibilidad de su código si evitara las abreviaturas y utilizara la carcasa camel, por ejemplo, sourceAddress en lugar de srcadd.

 36
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-12 15:39:42

A veces el cálculo hashcode va más allá del Integer.MAX_VALUE, es decir, 2147483647. lo que sucede entonces es que obtenemos un entero negativo después de la overflow. Hashcode negativo es perfectamente válido!

 19
Author: Pravat Panda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-23 00:44:29

Es perfectamente legal tener códigos hash negativos , y si está buscando valores hash como se usa en las colecciones basadas en hash, puede usar Math.abs(hash). Esto también puede darle números negativos cuando hash es mayor que 2^31, y la mejor manera sería usar una máscara de desplazamiento (key.hashCode() & 0x7fffffff) % M, donde M es el tamaño de la tabla.

 10
Author: Milky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-10 13:08:27