Problème de stabilité des hashcode sur des même Enum en Java

J’ai récemment eu un problème, dans lequel deux serveurs « concurrents » (mais avec la même application) me renvoyaient un flux avec des objets qu’un hashcode de ceux-ci. Hors pour un même objet, je me retrouvais avec deux hashcodes différents.

Après pas mal de recherche, j’ai fini par me rendre compte que le problème venait lui-même du hashcode de l’enum que contenait les objets, et à partir duquel (entre autres) était produit l’énum de l’objet.

Pire, à chaque redémarrage des serveur, les hashcodes changeaient ! Donc il semblait que le hashcode dépendait du serveur et changeait à chaque redémarrage.

En fait, c’est bien ça. Contrairement à d’autres ojects plus simple, les hashCode d’enum sont des méthodes prenant en plus de la simple valeur de l’énum une valeur (un « salt » en quelque sorte) qui est différents à chaque démarrage d’instance de java (en fait cette valeur dépend de l’adresse mémoire de l’instance) :

The method hashCode() in class Enum is final and defined as super.hashCode(), which means it returns a number based on the address of the instance, which is a random number from programmers POV.

Trouvé .

Evidemment, pas moyen d’overrider le HashCode() de la classe d’énum, car cette méthode est finale pour les énums. La seule possibilité, à mes yeux : faire un this.name().hashCode() car le name d’un Enum est unique, et que c’est un String, donc son hashCode est déterministe.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.