Meilleur moyen de hachage pour calculer tableau entier sans collision

Naethilis:

Les méthodes Java, Arrays.hashCode () ou Objects.hash () renvoient même hachage pour certains tableaux entiers avec un contenu différent, tel que

Integer[] a = {0,4,5,0}     // hash 927520
Integer[] b = {0,3,36,0}    // hash 927520

Le même résultat est renvoyé par la méthode hashcode personnalisée telle que:

public int hash(final Integer[] indexes) {
    final int prime = 31;
    int result = 1;
    for (Integer i : indexes) {
        result = prime * result + ((i == null) ? 0 : i.hashCode());
    }
    return result;
}

Je suis d'accord que c'est le comportement attendu. Mais, je veux générer hashcode distincts pour eux que le contenu sont différents.

Quel est le meilleur moyen de hachage pour calculer tableau entier sans collision

Eugène :

Le problème est un autre bit. Tout d' abord penser à la raison pour laquelle vous avez besoin hashCodepour commencer = pour rapide (er) look-ups. Avoir deux objets qui générerait le même hachage est pas un problème du tout, puisque cela ne signifie pas encore qu'ils sont les mêmes, bien sûr (vous toujours vérifier contre equals).

Vous avez déjà quelques commentaires sous votre question, disant que cela est impossible, je veux juste ajouter des choses intéressantes que vous ne l'avez pas pensé (peut-vous ne connaissez pas tout simplement).

En général, hash collisionssont beaucoup plus fréquentes en Java structures de données que vous pouvez l' imaginer. Selon le problème d'anniversaire et de prendre en considération que hashest en fait 32 bits, nous arrivons au fait que cela prendrait seulement 77164 valeurs uniques avant qu'il y ait une 50%chance de générer une collision (et qui est dans le meilleur des cas). Ainsi , les collisions sont plus que bien. Cela étant dit, il est JEP pour améliorer (dans ma compréhension en faisant d' abord le hachage - un longet de travail ce, mais n'a pas profondément plongé dans beaucoup).

Maintenant que vous savez que les collisions de hachage sont plus que bien, penser pourquoi ils sont utilisés. Fondamentalement , pour vite (er) consultation. Quand il y a deux entrées qui ont le même hash, cela signifie qu'ils vont finir dans le même « seau » et en java, ce seau, est un arbre rouge-noir parfaitement équilibré (pour HashMapet donc, HashSet) - qui est toujours super rapide lors de la recherche pour les entrées. Ainsi, en général , une structure à base de hachage a un temps de recherche qui est constant (ie: amorti O(1)), donc vous inquiétez pas les collisions de hachage.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=190800&siteId=1
conseillé
Classement