hashCode()
generalmente no va a ser un bijection, porque generalmente no va a ser un mapa injective.
hashCode()
tiene int
s como su rango. Solo hay 2^32 valores distintos de int
, por lo que para cualquier objeto donde haya más de 2^32 diferentes (por ejemplo, piense en Long
), está garantizado (por el pigeonhole principle que al menos dos objetos distintos tendrán la mismo código hash.
la única garantía de que hashCode()
que da es que si a.equals(b)
, entonces a.hashCode() == b.hashCode()
. Cada objeto que tiene el mismo código hash es consistente con esto.
usted puede utilizar el hashCode()
para identificar los objetos en algunas circunstancias muy limitadas: debe tener una clase particular en donde no haya más e de 2^32 posibles instancias diferentes (es decir, hay a lo sumo 2^32 objetos de su clase que por pares son tales que !a.equals(b)
). En ese caso, siempre y cuando se asegure de que cada vez que !a.equals(b)
y a
y b
sean objetos de su clase, ese a.hashCode() != b.hashCode()
, tendrá una biyección entre (clases de equivalencia de) objetos y códigos hash. (Podría hacerse así para la clase Integer
, por ejemplo).
Sin embargo, a menos que esté en este caso tan especial, debe crear una identificación única de otra manera.
Puede usar cifrado o codificación/decodificación (tal vez base64) para esto. – jerjer