web-dev-qa-db-fra.com

HashCode donnant des valeurs négatives

Je convertis la chaîne entrante en code de hachage en effectuant la fonction suivante mais certaines des valeurs sont négatives. Je ne pense pas que les valeurs de hachage doivent être négatives. Veuillez me dire ce que je fais mal.

int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);
27
Xara

Je ne pense pas que les valeurs de hachage doivent être négatives.

Pourquoi pas? Il est tout à fait valide d'avoir des codes de hachage négatifs. La plupart des façons de créer un code de hachage aboutissent naturellement à des valeurs négatives, et tout ce qui les concerne devrait en tenir compte. Cependant, je considérerais une approche différente pour trouver vos codes de hachage, par exemple.

int hash = 17;
hash = hash * 31 + srcadd.hashCode();
hash = hash * 31 + dstadd.hashCode();
hash = hash * 31 + sourceport; // I'm assuming this is an int...
hash = hash * 31 + destinationport; // ditto
hash = hash * 31 + protocol.hashCode();
return hash;

Le type de ces expressions n'est pas clair, mais je suppose que vous finissez par prendre le code de hachage d'une chaîne ... une chaîne que vous n'avez pas vraiment besoin de créer en premier lieu. Bien qu'il existe de meilleures approches pour obtenir des codes de hachage pour des domaines connus, l'approche ci-dessus fonctionne bien comme technique de génération de hachage à usage général.

Notez que cela aiderait également la lisibilité de votre code si vous évitiez les abréviations et utilisiez un boîtier de chameau, par ex. sourceAddress au lieu de srcadd.

41
Jon Skeet

parfois, le calcul hashcode lui-même va au-delà du Integer.MAX_VALUE, c'est à dire 2147483647. ce qui se passe alors, c'est que nous obtenons un entier négatif après le overflow. Le hashcode négatif est parfaitement valide!

24
Pravat Panda

Il est parfaitement légal d'avoir négatif codes de hachage, et si vous recherchez valeurs de hachage comme utilisé dans les collections basées sur le hachage, vous pouvez utiliser Math.abs(hash). Cela peut également vous donner des nombres négatifs lorsque le hachage est supérieur à 2 ^ 31, et la meilleure façon serait d'utiliser un masque de décalage (key.hashCode() & 0x7fffffff) % M, où M est la taille du tableau.

12
Milky