hashCode()
non è in genere un bijection, perché in genere non sarà una mappa injective.
hashCode()
ha come intervallo il int
s. Ci sono solo 2^32 valori distinti int
, quindi per qualsiasi oggetto in cui ci possono essere più di 2^32 diversi (ad esempio, pensare a Long
), si è certi (dal pigeonhole principle che almeno due oggetti distinti avranno il stesso codice hash.
l'unica garanzia che hashCode()
si dà è che se a.equals(b)
, quindi a.hashCode() == b.hashCode()
. Ogni oggetto che ha lo stesso codice hash è coerente con questo.
È possibile utilizzare il hashCode()
per identificare in modo univoco gli oggetti in alcune circostanze molto limitate: devi avere una classe particolare in cui non ci sono mor e di 2^32 possibili istanze diverse (cioè ci sono al massimo 2^32 oggetti della tua classe che a coppie sono tali che !a.equals(b)
). In tal caso, fintanto che ci si assicura che ogni volta che !a.equals(b)
ed entrambi a
e sono oggetti della classe, che a.hashCode() != b.hashCode()
, si avrà una biiezione tra (equivalenza classi di) oggetti e codici hash. (Potrebbe essere fatto in questo modo per la classe Integer
, ad esempio.)
Tuttavia, a meno che tu non sia in questo caso molto speciale, dovresti creare un ID univoco in un altro modo.
Per questo è possibile utilizzare la crittografia o la codifica/decodifica (forse base64). – jerjer