Vous ne savez pas comment les deux structures de données gèrent les collisions de hachage. Les filtres de bloom ne stockent pas les valeurs réelles, donc l'espace requis est la taille constante de la matrice désignée. Au lieu de cela, si vous utilisez un hachage traditionnel, il essaie de stocker toutes les valeurs que vous lui donnez, donc il grandit avec le temps.
Prenons une fonction de hachage simplifiée (pour un exemple uniquement!) f(x) = x % 2
. Maintenant , vous entrez les nombres entiers suivants: 2, 3, 4, 5, 6, 7
.
Hash standard: les valeurs données seront hachées, et nous nous retrouvons avec beaucoup de collisions dues à f(2) = f(4) = f(6) = 0
et f(3) = f(5) = f(7) = 1
. Néanmoins, le hachage stocke toutes ces valeurs et il pourra vous dire qu'il 8
n'y est pas stocké. Comment ça fait ça? Il garde une trace des collisions et stocke toutes les valeurs avec la même valeur de hachage, puis lorsque vous l'interrogez, il compare également votre requête. Examinons donc la carte pour 8
:, f(8) = 0
donc elle va chercher dans un compartiment où nous avons déjà inséré 2, 4, 6
et doit faire 3 comparaisons afin de vous dire que cela 8
ne faisait pas partie de l'entrée.
Filtre Bloom: Normalement, chaque valeur d'entrée est hachée contre k
différentes fonctions de hachage. Encore une fois, pour simplifier, supposons simplement que nous n'utilisons que la fonction de hachage unique f
. Nous avons alors besoin d'un tableau de 2 valeurs et lorsque nous rencontrons l'entrée, 2
cela signifie qu'en raison de f(2) = 0
nous définissons la valeur du tableau en position 0
sur la valeur 1
. La même chose se produit pour 4
et 6
. De même, les entrées 3, 5, 7
définissent chacune la position du tableau 1
sur valeur 1
. Maintenant, nous demandons si 8
faisait partie de l'entrée: f(8) = 0
et le tableau à la position 0
est 1
, donc le filtre de floraison prétendra faussement que cela 8
faisait effectivement partie de l'entrée.
Pour être un peu plus réaliste, considérons que nous ajoutons une deuxième fonction de hachage g(x) = x % 10
. Avec cela, la valeur d'entrée 2
conduit à deux valeurs de hachage f(2) = 0
et g(2) = 2
et les deux positions de tableau correspondantes seront définies sur 1
. Bien sûr, le tableau doit maintenant être au moins de taille 10
. Mais lorsque nous interrogerons, 8
nous vérifierons le tableau à la position 8
due à g(8) = 8
, et cette position sera toujours 0
. C'est pourquoi des fonctions de hachage supplémentaires diminuent les faux positifs que vous obtiendrez.
Comparaison: le filtre k
Bloom utilise des fonctions de hachage, ce qui signifie que k
des positions de tableau aléatoires sont accessibles. Mais ce chiffre est exact. Au lieu de cela, le hachage ne vous garantit qu'un temps d'accès constant amorti, mais peut se générer en fonction de la nature de votre fonction de hachage et des données d'entrée. Il est donc généralement plus rapide, sauf pour les cas dé-générés.
Cependant, une fois que vous avez une collision de hachage, le hachage standard devra vérifier l'égalité des valeurs stockées par rapport à la valeur de la requête. Ce contrôle d'égalité peut être arbitrairement coûteux et ne se produira jamais avec un filtre de bloom.
En termes d'espace, le filtre de bloom est constant, car il n'est jamais nécessaire d'utiliser plus de mémoire que le tableau désigné. D'un autre côté, le hachage se développe dynamiquement et peut devenir beaucoup plus important en raison du fait de devoir suivre les valeurs en collision.
Compromis: Maintenant que vous savez ce qui est bon marché et ce qui ne l'est pas et dans quelles circonstances, vous devriez pouvoir voir le compromis. Les filtres Bloom sont parfaits si vous voulez détecter très rapidement qu'une valeur a été vue précédemment, mais peut vivre avec des faux positifs. D'autre part, vous pouvez choisir la carte de hachage si vous voulez une exactitude garantie au prix de ne pas pouvoir évaluer exactement votre temps d'exécution, mais pouvez accepter des cas dégénérés occasionnellement qui peuvent être beaucoup plus lents que la moyenne.
De même, si vous êtes dans un environnement mémoire limité, vous pouvez préférer les filtres de floraison pour leur garantie d'utilisation de la mémoire.