hashCode()
ist ein bijection im Allgemeinen nicht, weil es im Allgemeinen nicht eine injective Karte sein wird.
hashCode()
hat int
s als seine Reichweite. Es gibt nur 2^32 verschiedene int
Werte, so dass für jedes Objekt, wo es mehr als 2^32 verschiedene geben kann (zB denken Sie an Long
), sind Sie garantiert (durch die pigeonhole principle, dass mindestens zwei verschiedene Objekte haben gleichen Hash-Code.
die einzige Garantie, dass hashCode()
Sie gibt, ist, dass, wenn a.equals(b)
, dann a.hashCode() == b.hashCode()
. Jedes Objekt den gleichen Hash-Code aufweist, ist im Einklang mit diesem.
Sie können verwenden die hashCode()
zur eindeutigen Identifikation von Objekten in einigen sehr begrenzten Umständen: Sie müssen eine bestimmte Klasse haben, in der es keinen mor gibt e als 2^32 mögliche unterschiedliche Instanzen (d. h. es gibt höchstens 2^32 Objekte Ihrer Klasse, die paarweise so sind, dass !a.equals(b)
). In diesem Fall, solange Sie sicherstellen, dass immer !a.equals(b)
und a
und b
Objekte Ihrer Klasse sind, nämlich a.hashCode() != b.hashCode()
, haben Sie eine Bijektion zwischen (Äquivalenzklassen von) Objekten und Hash-Codes. (So könnte es beispielsweise für die Klasse Integer
gemacht werden.)
Wenn Sie jedoch nicht in diesem speziellen Fall sind, sollten Sie eine eindeutige ID auf andere Weise erstellen.
Sie können dafür Verschlüsselung oder Kodierung/Dekodierung (vielleicht base64) verwenden. – jerjer