tabla programacion huella hashing generador functions funciones funcion ejemplos codigo java boolean hashcode

java - programacion - huella hash



¿Por qué el código hash de diferentes instancias booleanas es siempre el mismo? (6)

En el siguiente código, el código hash siempre es el mismo. ¿Por qué es así?

Código:

public class BooleanClass { public static void main(String[] args) { Boolean b1 = new Boolean(true); Boolean b2 = new Boolean(false); Boolean b3 = new Boolean(true); Boolean b4 = new Boolean(false); Boolean b5 = new Boolean(false); Boolean b6 = new Boolean(true); System.out.println(b1.hashCode()); System.out.println(b2.hashCode()); System.out.println(b3.hashCode()); System.out.println(b4.hashCode()); System.out.println(b5.hashCode()); System.out.println(b6.hashCode()); } }

Salida:

1231 1237 1231 1237 1237 1231

Siempre se imprimen los mismos números 1231 y 1237 . ¿Cualquier razón?


Directamente de la clase booleana:

public int hashCode() { return ((this.value) ? 1231 : 1237); }

Este es el método que genera el código hash para el tipo booleano. Es por eso que siempre obtienes el mismo código hash para verdadero o falso.

y este es el constructor de Boolean

public Boolean(boolean paramBoolean) { this.value = paramBoolean; }

entonces this.value será verdadero o falso si es verdadero dará 1231 y si es falso dará 1237


El contrato para hashCode () es:

Si dos objetos son iguales de acuerdo con el método equals(Object) , al llamar al método hashCode() en cada uno de los dos objetos debe producir el mismo resultado entero.

Y aunque boolean solo tiene dos valores, true y false , obtienes solo dos códigos hash diferentes.


El objetivo de una función hash es mapear datos de longitud arbitraria a datos de una longitud fija. Los valores devueltos por una función hash se denominan valores hash, códigos hash, sumas hash, sumas de comprobación o simplemente hash. Una función hash siempre devolverá exactamente el mismo hash siempre que la entrada sea la misma, por lo que el hashing true siempre será igual a 1231 y el hash false siempre será igual a 1237


No entiendo por qué la pregunta despertó tanta atención. Me sorprendería si fuera de otra manera. Como otros señalaron muy bien, incluso se especifica en la documentación .

Pero incluso si no hay documentación, es fácil entender el motivo: simplemente puede verificar la definición de una función de function hash.

Una función hash es cualquier algoritmo que mapea datos de longitud arbitraria a datos de una longitud fija.

Y a partir de la definición matemática, el mapa es una función, lo que significa que los mismos valores siempre producirán el mismo valor.

Si esto no puede ayudar, solo puede mirar este ejemplo:

int a = 400; int b = 400;

¿Deberías esperar que los hashes sean diferentes? Probablemente no. Entonces, ¿por qué deberían ser diferentes en caso de ser verdadero y falso?


Si realmente necesita distinguir instancias en lugar de valores, lo cual es MUY rara vez lo que realmente quiere, pero ocurre de vez en cuando, consulte IdentityHashMap .

(Esencialmente, IdentityHashMap omite las .equals() y .hashcode() en la clase "real" del Object y las usa desde Object ).


El método Boolean.hashCode() of Boolean.hashCode() dice:

Devuelve el entero 1231 si este objeto representa true ; devuelve el entero 1237 si este objeto representa false .