Filtre de Bloom
En informatique, et plus précisément en algorithmique, un filtre de Bloom est une structure de données inventée par Burton Howard Bloom en 1970. C'est une implémentation du type abstrait Ensemble. Cette structure est probabiliste, c'est-à -dire qu'elle utilise des probabilités, et que sa correction est probabiliste. Plus précisément, lors du test de la présence d'un élément dans un ensemble, un filtre de Bloom permet de savoir :
- avec certitude l'absence d'un élément (il ne peut pas y avoir de faux négatif) ;
- avec une certaine probabilité la présence d'un élément (il peut y avoir des faux positifs).
La taille d'un filtre de Bloom est fixe et indĂ©pendante du nombre d'Ă©lĂ©ments contenus, ce qui en fait une structure trĂšs compacte. L'inconvĂ©nient est toutefois qu'il y a d'autant plus de faux positifs qu'il y a d'Ă©lĂ©ments dans la structure. Le principe du filtre est le mĂȘme que pour le hachage.
Description
Un filtre de Bloom est constituée d'un tableau de bits de taille m, ainsi qu'une collection de k fonctions de hachage . Chaque fonction de hachage associe tout élément à une case du tableau[1]. En général, k est une constante qui dépend du taux de faux positifs souhaité, tandis que m est proportionnel à k et au nombre d'éléments à ajouter.
Description formelle
Soit U l'univers de tous les éléments que pourrait contenir l'ensemble considéré. Par exemple, U est l'ensemble des entiers sur 32 bits, ou un ensemble de mots. Le filtre a deux composantes[2] :
- T : un tableau de bits de taille m dont chaque case est initialisée à 0. (indexé de 1 à m)
- : k fonctions de hachage de .
Opérations
Pour ajouter un élément , on met des 1 dans les cases d'indice .
Pour tester si un élément est présent, on vérifie que les cases d'indice contiennent toutes un 1. Il se peut que le test d'appartenance renvoie vrai alors que l'élément est absent, c'est un faux positif.
Les Ă©lĂ©ments ne peuvent pas ĂȘtre retirĂ©s de l'ensemble (bien que cela soit possible avec certaines variantes telles que les filtres de Bloom par comptage (en)).
Propriétés
Espace mémoire
Le filtre de Bloom utilise un espace constant. C'est son principal intĂ©rĂȘt.
Proportion de faux-positifs
Il est possible d'évaluer la proportion de faux-positifs en fonction de divers paramÚtres. Ainsi, si l'on considÚre une fonction de hachage qui choisit un élément de l'ensemble de maniÚre équiprobable, et que m représente le nombre de bits dans le tableau, alors la probabilité qu'un bit donné soit laissé à 0 par une fonction de hachage donnée lors de l'insertion d'un élément vaut .
Généralisons ceci à un ensemble contenant exactement k fonctions de hachage. La probabilité qu'un bit donné soit laissé à 0 par l'une des fonctions de hachage lors de l'insertion d'un élément est .
Si l'on considÚre à présent que l'on insÚre n éléments (par exemple des chaßnes de caractÚres, etc.), la probabilité qu'un bit donné vaille 0 vaut . On en déduit que la probabilité que ce bit vaille 1 est
Ainsi, si l'on teste la probabilité de présence d'un élément qui n'est pas dans l'ensemble, chacune des m positions possÚde la probabilité ci-dessus de valoir 1. Si l'on suppose (et cette supposition est fausse) que ces événements sont indépendants, la probabilité que tous les k vaillent 1 (déclenchant un faux-positif) découle des calculs précédents :
La formule ci-dessus suppose que la probabilité que chaque bit vaille 1 est indépendante des autres bits, ce qui est faux, et peut mener à des résultats significativement différents quand est élevé[3]. Au contraire, quand le rapport est faible, le taux d'erreur tend effectivement vers la valeur ci-dessus.
La formule exacte est plus complexe, et vaut :
Cette valeur peut ĂȘtre calculĂ©e rĂ©cursivement. Cependant, il est simple d'utiliser l'encadrement suivant, donnĂ© par Bose et al. [4] :
Utilisations
Bases de données
Un filtre de Bloom permet d'Ă©viter des appels inutiles Ă une trĂšs grande base de donnĂ©es en vĂ©rifiant tout de suite l'absence d'une ligne recherchĂ©e. Le filtre n'Ă©tant pas parfait, la recherche inutile aura toutefois lieu dans certains cas, mais une grande partie sera nĂ©anmoins Ă©vitĂ©e, multipliant ainsi le nombre de requĂȘtes utiles possibles Ă matĂ©riel donnĂ©. Cette mĂ©thode est utilisĂ©e par Google dans leur base de donnĂ©es distribuĂ©es, BigTable[5].
Bio-informatique
Les filtres de Bloom sont utilisés en bio-informatique pour la recherche rapide de motifs dans des larges jeux de données génomiques[6].
Inspection de paquets
Ce type de filtre est également utilisé pour réaliser de l'inspection de paquets en profondeur[7], en vertu des raisons citées plus haut. Leur implémentation au niveau matériel a permis de réaliser de l'inspection de paquets en profondeur à la vitesse du réseau.
Flux pair Ă pair
Elle permet aussi d'optimiser les flux entre pairs dans un rĂ©seau informatiques pair Ă pair (comme Gnutella, BitTorrent, Freenet, le rĂ©seau Tor, les nĆuds Bitcoin, et bien d'autres)[8].
Cela permet de rĂ©duire le nombre de recherches Ă transmettre Ă un sous-ensemble suffisant de pairs voisins pour trouver par quels chemins un objet identifiable est accessible, sans avoir Ă les interroger tous simultanĂ©ment avant d'Ă©tablir de nouveaux chemins supplĂ©mentaires vers d'autres pairs, si aucun de ceux interrogĂ©s ne donnent de rĂ©ponse en un temps raisonnable. En effet, la surconsommation sur le rĂ©seau global par les diverses recherches identiques effectuĂ©es en parallĂšle par les pairs dĂ©jĂ atteints, s'ils ne possĂšdent pas directement eux-mĂȘmes une copie de l'objet demandĂ© croit rapidement de façon exponentielle avec la longueur maximale des chemins de recherche (en fonction du degrĂ© moyen d'interconnexion de chacun des pairs et de la profondeur atteinte, mĂȘme si chacun des nĆuds traversĂ©s dispose d'un cache local lui Ă©vitant de rĂ©pĂ©ter en aval la mĂȘme recherche provenant de plusieurs pairs en amont).
- Par exemple sur un rĂ©seau pair Ă pair connexe comprenant au total 100 000 nĆuds, et oĂč chacun des nĆuds est interconnectĂ© Ă 10 nĆuds (choisis idĂ©alement de façon alĂ©atoire parmi les 100 000 nĆuds connus), une exploration totale Ă une profondeur de 5 niveaux permettrait en principe d'interroger tous les nĆuds du rĂ©seau si la topologie Ă©tait parfaitement hypercubique de degrĂ© 10; cependant la sĂ©lection des nĆuds Ă©tant alĂ©atoire, la couverture totale du rĂ©seau ne sera pas atteinte car des nĆuds seront traversĂ©s plusieurs fois, par des chemins diffĂ©rents (mais aussi avec des dĂ©lais diffĂ©rents sur chaque chemin suivi, selon les profondeurs, les dĂ©bits et les taux d'occupation variables de chacun des chemins suivis d'un nĆud Ă l'autre et les dĂ©lais de traitement par chacun des nĆuds traversĂ©s).
- Du fait que le rĂ©seau ne soit pas suffisamment couvert, le risque est alors Ă©levĂ© que le rĂ©seau ne soit plus fortement connexe, mais formĂ© d'Ăźlots devant inaccessibles entre eux (mĂȘme s'il existe encore une liaison entre ces Ăźlots, cette liaison peut ĂȘtre totalement saturĂ©e donc inutilisable pour Ă©viter la formation de tels Ăźlots). On augmente donc la profondeur d'exploration des chemins au delĂ de 5, et on permet Ă©galement au nĆuds intermĂ©diaires de librement pouvoir augmenter localement leur degrĂ© d'interconnexion (s'ils peuvent se le permettre en fonction de leurs capacitĂ© locale) et cela accroit encore plus la redondance des requĂȘtes identiques puisque chaque nouvelle profondeur peut potentiellement multiplier par 10 le nombre total des requĂȘtes vĂ©hiculĂ©es sur le rĂ©seau (et de mĂȘme toutes les rĂ©ponses associĂ©es pouvant provenir plusieurs fois des mĂȘmes nĆuds finaux disposant de l'objet cherchĂ©).
- Cette croissance exponentielle de recouvrement des chemins alĂ©atoire, si elle reste incontrĂŽlĂ©e, conduit fatalement Ă la saturation des liaisons individuelles, notamment au plus prĂšs du nĆud initiateur de la recherche et des rares nĆuds du rĂ©seau qui peuvent y rĂ©pondre (Ă©galement au cas oĂč certains nĆuds ne sont plus accessibles que par un seul chemin critique ou une poignĂ©e insuffisante de chemins) ; au cas oĂč aucun des nĆuds du rĂ©seau ne dispose de l'objet recherchĂ©, la totalitĂ© des nĆuds rĂ©seau sera intensivement recherchĂ© plusieurs fois par tous les chemins possibles (y compris le nĆud initiateur de la recherche initiale si le chemin suivi par une recherche relayĂ©e en amont n'est pas transmis en aval par les nĆuds intermĂ©diaires). Le rĂ©seau pair Ă pair devient alors trĂšs inefficace, il se sature trĂšs vite en totalitĂ©. Il faut donc modĂ©rer le degrĂ© de propagation des recherches en aval, quitte Ă introduire des dĂ©lais en utilisant des prioritĂ©s, et utiliser une mise en cache avec une durĂ©e raisonnable mais suffisante, sans saturer non plus le cache local de chaque nĆud avec les requĂȘtes dĂ©jĂ transmises en amont et les rĂ©ponses dĂ©jĂ retournĂ©es en aval).
- Il faut donc disposer d'une heuristique permettant de calculer de façon probabiliste et rĂ©duire les recouvrements de chemins, tout en conservant la possibilitĂ© de parcourir une partie suffisante du rĂ©seau connexe. Un filtre Bloom permet de dĂ©finir cette probabilitĂ© suffisante pour Ă©liminer une grande quantitĂ© des requĂȘtes redondantes, qu'il n'est alors pas utile de transmettre en aval aux nĆuds voisins, en tenant compte au niveau de chaque nĆud intermĂ©diaire des rĂ©ponses positives ou nĂ©gatives dĂ©jĂ obtenues sur chaque chemin dĂ©jĂ interrogĂ© en aval, mais aussi d'Ă©liminer les rĂ©ponses identiques dĂ©jĂ renvoyĂ©es en aval au demandeur mais qui pourraient arriver depuis les chemins en amont dĂ©jĂ interrogĂ©s. Et cela ne demande aucune connaissance prĂ©alable de la topologie effective du rĂ©seau pair Ă pair (d'autant plus si ces nĆuds peuvent se connecter ou se dĂ©connecter librement du rĂ©seau, et que donc cette topologie est fluctuante).
- De plus le nombre de nĆuds participant au rĂ©seau n'est pas nĂ©cessairement connu au dĂ©part et peut fluctuer au cours du temps : le rĂ©seau dispose aussi d'un protocole de dĂ©couverte, qui lui aussi va utiliser des annonces rĂ©cursives de propagation des nĆuds actuellement connectĂ©s et actifs et d'une indication de leur derniĂšre date connue d'activitĂ©, afin que cela soit mis en cache et rĂ©percutĂ© aux autres nĆuds qui pourront alors tenter d'y Ă©tablir une liaison, s'ils souhaitent augmenter leur degrĂ© d'interconnexion. Ce protocole adjoint au rĂ©seau pair Ă pair est ce qui assure de conserver le rĂ©seau fortement connexe (sans formation d'Ăźlots, et encore moins facilement de vastes continents longtemps sĂ©parĂ©s), mais lui aussi bĂ©nĂ©ficie d'un filtre de Bloom pour qu'il reste efficace. Mais il dĂ©pend aussi de la synchronisation des horloges entre les nĆuds ou de pouvoir mesurer leurs Ă©carts, faute de quoi la pertinence de la datation des noeuds dĂ©couverts et rĂ©putĂ©s actifs serait compromise et pourrait mĂȘme amener Ă des perturbations massives et trĂšs indĂ©sirables : cela permettrait des attaques distribuĂ©es de dĂ©ni de service (DDoS) vers des nĆuds ne participant pas du tout au protocole de dĂ©couverte, ni mĂȘme au rĂ©seau pair Ă pair lui-mĂȘme, et vite conduire soit au bannissement du protocole pair Ă pair sur une partie significative de l'Internet ou de ses points d'accĂšs publics, ou Ă une forte dĂ©gradation des dĂ©bits autorisĂ©s sur chaque liaison d'un nĆud Ă l'autre.
La mĂȘme problĂ©matique survient sur des topologies de rĂ©seau pair Ă pair pour les systĂšmes de rĂ©plication et d'annonce, notamment au sein des protocoles d'annonce de routage entre rĂ©seaux IP (avec des pairs, les routeurs, fortement hĂ©tĂ©rogĂšnes selon leurs capacitĂ© de traitement ou de mise en cache, leur degrĂ© local d'interconnexion et les dĂ©bits utilisables sur chacune de leurs liaison d'interconnexion), ou encore pour la rĂ©plication et la mise en cache des requĂȘtes de rĂ©solution DNS (et la vĂ©rification de leur authenticitĂ©). Sur Internet, il existe gĂ©nĂ©ralement un noyau relativement stable d'interconnexions au sein du rĂ©seau, entre des nĆuds Ă forte capacitĂ© de traitement et de mise en cache local (disposant entre eux de liaisons trĂšs rapides et avec un degrĂ© d'interconnexion plus Ă©levĂ© que le reste du rĂ©seau), mais cette optimisation avec des filtres de Bloom Ă©vite lĂ encore la saturation de ces nĆuds fortement sollicitĂ©s et de leurs liaisons, qui malgrĂ© tout peuvent connaitre des variations, du fait de pannes intermittentes sur les nĆuds ou leurs liaisons, ou des besoins rĂ©guliers de maintenance locale de ces systĂšmes.
Rendu HTML
Ce filtre est utilisé dans les moteurs de rendu HTML pour augmenter les performances des sélecteurs CSS[9].
Références
- « Bloom filters, streaming algorithms, the count-min sketch », sur Université d'Illinois, .
- Antoine Genitrini, « Algorithmique avancée : Méthode de hachage », sur Université Pierre-et-Marie-Curie, .
- (en) Ken Christensen, Allen Roginsky, Miguel Jimeno, « A new analysis of the false positive rate of a Bloom filter », Information Processing Letters, vol. 110, no 21,â , p. 944-949 (lire en ligne).
- (en) Prosenjit Bose, Hua Guo, Evangelos Kranakis, Anil Maheshwari, Pat Morin, Jason Morrison, Michiel Smid, Yihui Tang, « On the false-positive rate of Bloom filters », Information Processing Letters, vol. 108, no 4,â , p. 210-213 (lire en ligne).
- Fay Chang, Jeffrey Dean, Sanjay Ghemawat, Wilson C Hsieh, Deborah A Wallach, Mike Burrows, Tushar Chandra, Andrew Fikes et Robert E Gruber, « Bigtable: A distributed storage system for structured data, », ACM Transactions on Computer Systems (TOCS), ACM, vol. 26, no 2,â , p. 4 (lire en ligne)
- Camille Marchet, « Data structures based on k-mers for querying large collections of sequencing datasets »,
- Deep packet Inspection using parallel Bloom Filters
- Sasu Tarkoma, « Overlay and P2P Networks Unstructured networks », .
- (en) Nicole Sullivan, « CSS Selector Performance has changed! (For the better) », sur Performance Calendar, .
Bibliographie
- Burton H. Bloom, « Space/Time Trade-offs in Hash Coding with Allowable Errors », Commun. ACM, vol. 13, no 7,â , p. 422-426 (prĂ©sentation en ligne)