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étodohashCode()
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 representatrue
; devuelve el entero1237
si este objeto representafalse
.