2010-12-10 64 views
2

Quel est le meilleur moyen de calculer le code de hachage d'un Map, sachant qu'il peut contenir des valeurs d'entrée de types tels que: String, ...?Java Map hash code

Map.hashCode() renvoie un code de hachage peu profond. Cela signifie que si vous avez un String[] dans votre carte, le Map.hashCode() utilisera également le hachage retourné par le String[]. Ce qui, malheureusement, n'est pas ce que je veux (l'implémentation Object.hashCode()). Mais je veux la mise en œuvre Arrays.hashCode(String[]).

Alors, quelle est la meilleure approche générique pour gérer cela?

+1

Je suppose que votre carte est immuable? Si vous ajoutez/supprimez des entrées, votre hashCode() basé sur des valeurs est condamné. –

+0

Je pense que la question initiale de la plupart des gens sera "pourquoi?" que faites-vous que vous avez besoin de changer le hashcode de la carte? calculer un "hachage" "profond" pourrait rendre cette opération très coûteuse ... –

+1

@Kirk Woll: s'il vous plaît détail, quel est le point? – javaq

Répondre

5

Si vous avez besoin de savoir si deux cartes contiennent les mêmes valeurs, vous devrez écrire une méthode de comparaison approfondie. vous ne devriez pas dépendre de hashCode.

même avec un algorithme parfait, il n'y a aucun moyen que chaque collection possible de chaque objet possible puisse être représentée uniquement par un seul entier signé.

Hashcode est juste pour la réduction collision lorsqu'il est utilisé dans les collections, il est pas censé être utilisé pour identifier de manière unique objets.

+0

Merci. Connaissez-vous d'autres moyens efficaces pour atteindre mon objectif? – javaq

+1

Si vous avez besoin de savoir que deux collections sont * exactement * les mêmes, il n'y a pas d'autre moyen de faire autre chose qu'une comparaison approfondie. les choses qui ne sont pas les mêmes peuvent échouer rapidement, mais le pire est toujours de comparer chaque objet intérieur, y compris les comparaisons internes de chaque collection intérieure ... –

3

La solution à votre problème consiste à ne pas utiliser de tableaux. Utilisez ArrayLists (ou une autre forme de liste, comme une liste ImmutableList de Google Guava). Listes hachez comme vous le souhaitez. En outre, les tableaux ne jouent pas vraiment bien avec les génériques (comme Maps).

+0

Ceci n'est pas une solution. Je ne peux pas contrôler l'entrée. Finalement, je pourrais remplacer récursivement les tableaux avec des listes de tableaux, mais j'éviterais cela. – javaq