Comprendre les filtres de Bloom par l’exemple
(llimllib.github.io)- Un filtre de Bloom est une structure de données probabiliste qui permet de vérifier rapidement la présence d’un élément dans un ensemble de manière efficace en mémoire
- Il indique seulement si un élément est certainement absent de l’ensemble ou peut-être présent, avec une probabilité de faux positifs
- Sa structure de base repose sur un vecteur de bits et plusieurs fonctions de hachage qui positionnent à 1 les bits correspondant à chaque élément
- Le taux d’erreur et les performances dépendent de la taille du filtre et du nombre de fonctions de hachage, avec des réglages possibles selon l’usage
- L’article présente aussi les fonctions de hachage recommandées, les méthodes de configuration optimale, l’efficacité spatiale et des cas d’usage concrets
Qu’est-ce qu’un filtre de Bloom ?
- Un filtre de Bloom est une structure de données qui permet de déterminer rapidement et avec une bonne efficacité mémoire si un élément est présent dans un ensemble
- Pour obtenir cette efficacité, le filtre de Bloom est une structure probabiliste dont le résultat d’un test se limite à « certainement absent de l’ensemble » ou « peut-être présent dans l’ensemble »
- La structure centrale d’un filtre de Bloom est un vecteur de bits
- Lorsqu’on ajoute un élément, on le hache plusieurs fois afin de mettre à 1 les bits des index correspondants
- Si tous les bits correspondant aux index produits par chaque fonction de hachage valent 1, on conclut que l’élément « peut être présent » ; sinon, on le considère comme « certainement absent »
Exemple de fonctionnement
- Plusieurs fonctions de hachage (ex. : Fnv, Murmur) servent à projeter un élément vers plusieurs index de bits
- Lors de l’ajout d’un élément, les bits des index calculés sont mis à 1
- Pour vérifier la présence d’un élément donné, si tous les index obtenus avec les mêmes fonctions de hachage valent 1, on considère qu’il « peut être présent »
- Si au moins un de ces bits vaut 0, on peut conclure avec certitude qu’il n’est pas dans l’ensemble
- Cela introduit la possibilité de faux positifs
Sujets avancés
Attention : l’auteur n’a en réalité aucune expérience directe d’utilisation d’un filtre de Bloom dans un service à grande échelle
Choix des fonctions de hachage
- Il est recommandé d’utiliser des fonctions de hachage indépendantes et à distribution uniforme
- Les fonctions de hachage cryptographiques (
sha1, etc.) ne conviennent pas, car elles sont trop lentes - Exemples de fonctions de hachage rapides et simples : Murmur, xxHash, Fnv, HashMix, etc.
- Dans un cas réel, le passage de md5 à murmur a permis un gain de vitesse de plus de 800 %
Déterminer la taille du filtre de Bloom
- Plus la taille du filtre (m) est grande, plus le taux de faux positifs diminue
- Le taux de faux positifs peut généralement être approximé par (1-e^(-kn/m))^k
- Il faut choisir de manière appropriée le nombre attendu d’éléments (n), la taille du filtre (m) et le nombre de fonctions de hachage (k)
Combien de fonctions de hachage ?
- Plus le nombre de fonctions de hachage est élevé, plus l’exécution ralentit et plus le filtre se remplit vite
- S’il y en a trop peu, le taux de faux positifs augmente
- La valeur idéale de k se calcule par (m/n)ln(2)
- Lors de la conception, on peut suivre la procédure suivante :
- estimer le nombre attendu d’éléments n
- fixer le nombre de bits m
- calculer le k optimal
- vérifier si le taux d’erreur souhaité est atteint ; sinon, ajuster m
Performances et efficacité spatiale
- Dans un filtre de Bloom, l’ajout d’un élément et le test de présence ont une complexité temporelle de O(k)
- L’efficacité spatiale dépend de la tolérance au taux d’erreur et de la plage d’éléments considérée
- S’il est impossible d’estimer même approximativement l’ordre de grandeur des éléments, une table de hachage ou un filtre de Bloom extensible peut être préférable
Cas d’usage
- Pour des exemples d’utilisation détaillés, voir Wikipedia
- C. Titus Brown présente un cas d’application des filtres de Bloom en bio-informatique
Références
- Broder, Mitzenmacher : Network Applications of Bloom Filters: A Survey — article de synthèse sur les filtres de Bloom
- Wikipedia – Bloom Filter
- Kirsch, Mitzenmacher: Less Hashing, Same Performance
- Almeida et al. : Scalable Bloom Filters
1 commentaires
Commentaires sur Hacker News
"bloom"et"demonstrators "(avec un espace final) entrent en collision sur fnv: 7, murmur: 12querySelector(), comme préfiltre de dictionnaire de recherche par hachage dans les buckets CSS, ou pour un rejet rapide lors de la recherche d’attributs Aria pour l’accessibilité. Les petits filtres 32 bits et 64 bits fonctionnent très bien en pratique. Des Bloom filters plus grands sont aussi utilisés de manière pertinente, et j’ai moi-même ajouté ce genre de fonctionnalité