Bloom-Filter anhand eines Beispiels verstehen
(llimllib.github.io)- Bloom-Filter sind eine probabilistische Datenstruktur, mit der sich speichereffizient und schnell prüfen lässt, ob ein Element in einer Menge enthalten ist
- Sie können nur angeben, ob ein Element sicher nicht vorhanden ist oder möglicherweise vorhanden sein könnte, wobei eine Wahrscheinlichkeit für False Positives besteht
- Die Grundstruktur verwendet einen Bit-Vektor und mehrere Hash-Funktionen, um die zu einem Element gehörenden Bits auf 1 zu setzen
- Fehlerrate und Performance werden durch die Größe des Filters und die Anzahl der Hash-Funktionen bestimmt und können je nach Einsatzzweck angepasst werden
- Vorgestellt werden außerdem empfohlene Hash-Funktionen, Methoden für optimale Einstellungen, Platzeffizienz und praktische Anwendungsbeispiele
Was ist ein Bloom-Filter?
- Ein Bloom-Filter ist eine Datenstruktur, mit der sich schnell und speichereffizient feststellen lässt, ob ein bestimmtes Element in einer Menge vorhanden ist
- Um diese Effizienz zu erreichen, ist der Bloom-Filter eine probabilistische Datenstruktur; das Prüfergebnis fällt daher in die Kategorien „sicher nicht in der Menge“ oder „möglicherweise in der Menge vorhanden“
- Die zentrale Struktur eines Bloom-Filters ist ein Bit-Vektor
- Beim Hinzufügen eines Elements wird dieses mehrfach gehasht, und die Bits an den entsprechenden Indizes werden auf 1 gesetzt
- Wenn die Bits an den von den jeweiligen Hash-Funktionen gelieferten Indizes alle 1 sind, wird das Ergebnis als „möglicherweise vorhanden“ gewertet, andernfalls als „sicher nicht vorhanden“
Beispiel für die Funktionsweise
- Mehrere Hash-Funktionen (z. B. Fnv, Murmur) bilden ein Element auf mehrere Bit-Indizes ab
- Beim Hinzufügen eines Elements werden die Bits an den berechneten Indizes auf 1 gesetzt
- Wenn bei der Prüfung eines bestimmten Elements alle mit denselben Hash-Funktionen und auf dieselbe Weise berechneten Indizes 1 sind, gilt das Element als „möglicherweise vorhanden“
- Falls auch nur eines dieser Bits 0 ist, lässt sich sicher feststellen, dass es nicht in der Menge ist
- Dadurch entsteht die Möglichkeit von False Positives
Fortgeschrittene Themen
Hinweis: Der Autor hat tatsächlich keine Erfahrung damit, Bloom-Filter in großen produktiven Services eingesetzt zu haben
Auswahl der Hash-Funktionen
- Empfohlen werden Hash-Funktionen, die unabhängig sind und eine gleichmäßige Verteilung haben
- Kryptografische Hash-Funktionen (sha1 usw.) sind langsam und daher ungeeignet
- Beispiele für schnelle und einfache Hash-Funktionen sind: Murmur, xxHash, Fnv, HashMix usw.
- In einem Praxisfall führte der Wechsel von md5 zu murmur zu einer Geschwindigkeitssteigerung von über 800 %
Bestimmung der Größe eines Bloom-Filters
- Je größer die Filtergröße (m) ist, desto geringer ist die False-Positive-Rate
- Die False-Positive-Rate lässt sich in der Regel mit (1-e^(-kn/m))^k näherungsweise berechnen
- Die erwartete Anzahl von Elementen (n), die Filtergröße (m) und die Anzahl der Hash-Funktionen (k) müssen passend gewählt werden
Wie viele Hash-Funktionen?
- Je mehr Hash-Funktionen verwendet werden, desto langsamer wird der Filter und desto schneller füllt er sich
- Bei zu wenigen steigt die False-Positive-Rate
- Das ideale k wird mit (m/n)ln(2) berechnet
- Beim Entwurf geht man typischerweise in folgenden Schritten vor:
- die erwartete Elementanzahl n schätzen
- die Bit-Anzahl m festlegen
- das optimale k berechnen
- prüfen, ob die gewünschte Fehlerrate erreicht wird; falls nicht, m anpassen
Performance und Platzeffizienz
- In einem Bloom-Filter haben Element hinzufügen / Existenz prüfen eine Zeitkomplexität von O(k)
- Die Platzeffizienz hängt vom tolerierten Fehlerratenbereich und vom Umfang der Elemente ab
- Wenn sich der Umfang der Elemente nicht wenigstens grob abschätzen lässt, sind eine Hash-Tabelle oder ein skalierbarer Bloom-Filter möglicherweise die bessere Wahl
Anwendungsfälle
- Für ausführlichere Beispiele siehe Wikipedia
- C. Titus Brown stellt Anwendungsbeispiele aus der Bioinformatik für Bloom-Filter vor
Referenzmaterial
- Broder, Mitzenmacher : Network Applications of Bloom Filters: A Survey — Überblickspapier zu Bloom-Filtern
- Wikipedia – Bloom Filter
- Kirsch, Mitzenmacher: Less Hashing, Same Performance
- Almeida et al.: Scalable Bloom Filters
1 Kommentare
Hacker-News-Kommentare
"bloom"und"demonstrators "(mit Leerzeichen am Ende) bei fnv: 7, murmur: 12.querySelector(), Vorfilter für Hash-Lookup in CSS-Buckets und schnelles Verwerfen bei der Suche nach ARIA-Attributen für Accessibility. Kleine 32- oder 64-Bit-Filter funktionieren in der Praxis ebenfalls gut. Auch größere Bloom-Filter werden sinnvoll eingesetzt, und ich habe solche Funktionen selbst hinzugefügt.