vulnerability example java hashcode negative-number

java - example - HashCode dando valores negativos.



override to string java (3)

No creo que los valores de hash deban ser negativos.

Por qué no? Es completamente válido tener códigos hash negativos. La mayoría de las formas de crear un código hash, naturalmente, terminan con valores negativos, y todo lo relacionado con ellos debe tener esto en cuenta. Sin embargo, consideraría un enfoque diferente para crear 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á terminando de tomar el código hash de una cadena ... una cadena que realmente no necesita crear en primer lugar. Si bien existen 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 usara la carcasa de camello, por ejemplo, sourceAddress lugar de srcadd .

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 de hash deban ser negativos. Por favor, dime lo que estoy haciendo mal.

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


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


a veces, el propio cálculo del hashcode va más allá de Integer.MAX_VALUE , es decir, 2147483647 . lo que sucede entonces es que obtenemos un entero negativo después del overflow . ¡El código de hash negativo es perfectamente válido!