HashCode de donner des valeurs négatives
Je suis la conversion de la chaîne en entrant le code de hachage en faisant la fonction suivante, mais certaines valeurs sont négatives. Je ne pense pas que les valeurs de hachage doit être négative. S'il vous plaît dites-moi ce que je fais de mal.
int combine = (srcadd + dstadd + sourceport + destinationport + protocol).hashCode();
System.out.println(combine);
- Pourquoi pas des codes de hachage être négatif? Autant que je sache, la seule exigence est d'être égal pour un des objets..
- les espaces sont agréables.
Vous devez vous connecter pour publier un commentaire.
Pourquoi pas? Il est tout à fait valide pour avoir des codes de hachage. La plupart des façons de venir avec un code de hachage naturellement jusqu'à la fin avec des valeurs négatives, et rien de traiter avec eux devrait tenir compte de cette. Cependant, je voudrais examiner une approche différente de venir avec vos codes de hachage, par exemple
Il n'est pas clair ce que les types de ces expressions, mais je devine que vous êtes en terminant de prendre le code de hachage d'une chaîne... une chaîne que vous n'avez pas vraiment besoin pour 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 un usage général de hachage technique de génération.
Note qu'il serait également aider à la lisibilité de votre code si vous éviter les abréviations, et utilisé chameau boîtier, par exemple
sourceAddress
au lieu desrcadd
.int
ne prend pas en charge d'un nombre supérieur à 2^31 - 1... est une valeur de 32 bits, mais dans un signé gamme.parfois la
hashcode
calcul lui-même va au-delà de laInteger.MAX_VALUE
, j'.e2147483647
. ce qui se passe alors c'est que nous obtenons un nombre entier négatif après laoverflow
. Négatif hashcode est parfaitement valide!Il est parfaitement légal d'avoir des négatifs des codes de hachage, et si vous êtes à la recherche pour valeurs de hachage utilisé dans la base de hachage des collections, vous pouvez utiliser
Math.abs(hash)
. Cela peut également vous donner des nombres négatifs lors de hachage est plus grand que 2^31, et le meilleur moyen serait d'utiliser un changement de masque(key.hashCode() & 0x7fffffff) % M
, où M est la taille de la table.(key.hashCode() & 0x7fffffff)
? Parce que c'est un simple 1-étape de l'opération binaire sur le résultat dehashCode()
qui devrait (ou pourrait) l'exécution est plus rapide queMath.abs()
.