Ein Bloom-Filter ist eine probabilistische Datenstruktur, mit der effizient geprüft werden kann, ob ein Element Teil einer Gruppe ist. Er wurde 1970 von Burton Howard Bloom erfunden und ist aufgrund seiner Fähigkeit, große Datenmengen mit minimalem Speicherverbrauch zu verwalten, zu einem grundlegenden Werkzeug in der Informatik geworden. Im Gegensatz zu traditionellen Datenstrukturen wie Hash-Tabellen oder binären Suchbäumen kann ein Bloom-Filter eine definitive Antwort geben, wenn ein Element nicht in der Gruppe enthalten ist, aber nur eine probabilistische Antwort, wenn ein Element enthalten ist. Das bedeutet, dass zwar falsch-positive Ergebnisse möglich sind, falsch-negative jedoch nicht.
Das Kernkonzept eines Bloom-Filters dreht sich um ein Array von Bits, die anfangs alle auf 0 gesetzt sind, und eine Reihe von Hash-Funktionen. Wenn ein Element zum Bloom-Filter hinzugefügt wird, wird es durch jede der Hash-Funktionen geleitet, um mehrere Positionen im Bit-Array zu erzeugen. Die Bits an diesen Stellen werden dann auf 1 gesetzt. Um zu überprüfen, ob ein Element in der Menge enthalten ist, wird es erneut mit denselben Funktionen gehasht, und die entsprechenden Bits werden überprüft. Wenn alle Bits an diesen Positionen 1 sind, wird das Element als mögliches Element in der Gruppe betrachtet; wenn eines der Bits 0 ist, ist das Element definitiv nicht in der Gruppe.
Einer der wichtigsten Vorteile von Bloom-Filtern ist ihre Platzersparnis. Sie benötigen im Vergleich zu anderen Datenstrukturen für die gleiche Aufgabe deutlich weniger Speicherplatz, insbesondere wenn die Anzahl der Elemente steigt. So werden beispielsweise weniger als 10 Bits pro Element benötigt, um eine Falsch-Positiv-Wahrscheinlichkeit von 1 % zu erreichen, unabhängig von der Anzahl der Elemente in der Gruppe. Dies macht Bloom-Filter besonders nützlich für Anwendungen, bei denen die Speichernutzung ein kritisches Thema ist, wie z. B. bei Netzwerk-Routern, Datenbanksystemen und verteilten Systemen.
Bloom-Filter sind jedoch mit gewissen Einschränkungen verbunden. Die Unmöglichkeit, Elemente aus der Gruppe zu entfernen, ist ein Hauptnachteil, da das Löschen von Bits, die durch mehrere Elemente gesetzt wurden, zu falsch negativen Ergebnissen führen würde. Um dieses Problem zu lösen, wurden Varianten wie Counting-Bloom-Filter entwickelt, die es ermöglichen, Elemente zu entfernen, indem die Anzahl der gesetzten Bits festgehalten wird. Außerdem steigt die Falsch-Positiv-Rate, je mehr Elemente hinzugefügt werden, was bedeutet, dass die Größe des Bit-Arrays und die Anzahl der Hash-Funktionen sorgfältig auf der Grundlage der erwarteten Anzahl von Elementen und der akzeptablen Falsch-Positiv-Rate ausgewählt werden muss.
In der Praxis sind Bloomfilter in verschiedenen Bereichen weit verbreitet. In Bitcoin werden sie beispielsweise verwendet, um die Privatsphäre in Simplified Payment Verification (SPV)-Clients zu verbessern, indem sie es den Nutzern ermöglichen, Transaktionen abzufragen, ohne ihre Adressen preiszugeben. Content-Delivery-Netzwerke wie Akamai verwenden Bloom-Filter, um den Cache-Speicher effizient zu verwalten und die Arbeitslast auf den Servern zu verringern, indem unnötige Datenabrufe vermieden werden. Trotz ihres probabilistischen Charakters und ihrer Einschränkungen sind Bloom-Filter nach wie vor ein unschätzbares Werkzeug für die Entwicklung effizienter und skalierbarer Systeme.