Implémentation efficace de hashCode () - Java, algorithme, structures de données, hashmap, hashcode

Je génère souvent automatiquement une classe "s hashCode() méthode utilisant IntelliJ IDEA et généralement la méthode prend la forme:

result = 31 * result + ...

Ma question est: quel est le but de la multiplication par 31? Je sais que c'est un nombre premier, mais pourquoi choisir 31 spécifiquement? En outre, si vous implémentez un hashCode() pour un ensemble de données particulièrement petit / grand, les gens aborderont-ils ce problème différemment?

Réponses:

20 pour la réponse № 1

La multiplication par 31 est rapide car le JIT peut le convertir en décalage de 5 bits et soustraire:

x * 31 == (x << 5) - x

Sans aucune information supplémentaire particulière, je m'en tiens à cette approche. Elle est raisonnablement rapide et risque de se retrouver avec des codes de hachage raisonnablement distribués, et il est également facile de faire les choses correctement :)

La taille du jeu de données n'a pas vraiment d'importance, mais si vous avez des informations supplémentaires sur les valeurs avec lesquelles vous travaillerez (par exemple, "il est toujours pair"), alors vous mai être capable de concevoir une meilleure fonction de hachage. J'attendrais jusqu'à ce que ce soit un problème réel d'abord :)


Le plus populaire