Was ist der Vorteil der Verwendung von Bloom-Filtern?


108

Ich lese über Blütenfilter und sie scheinen einfach albern. Alles, was Sie mit einem Bloom-Filter erreichen können, können Sie auf weniger Raum und effizienter mit einer einzelnen Hash-Funktion anstelle mehrerer ausführen, oder so scheint es. Warum sollten Sie einen Bloom-Filter verwenden und wie ist er nützlich?


5
Hast du den Wikipedia-Artikel gelesen? Es erklärt die Vorteile ziemlich gut. en.wikipedia.org/wiki/Bloom_filter
Alex Budovski

@ David das scheint allerdings unwahrscheinlich. k Hash-Funktionen in einem konstanten Raum haben viel mehr Kollisionen als eine einzelne Hash-Funktion in einem konstanten Raum.
Kopfschmerzen

1
@ Alex Ich habe den Wikipedia-Artikel gelesen. Ich verstehe, was dort gesagt wird, aber ich verstehe nicht, warum es überhaupt besser ist. Warum es funktioniert, ist intuitiv. Warum es nützlich ist, ist nicht.
Kopfschmerzen

Dieser Schriftsteller macht einen tollen Job damit michaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo, Der verlinkte Artikel jasondavies.com/bloomfilter ist besser.
Pacerier

Antworten:


155

Aus Wikipedia :

Bloom-Filter haben einen starken Platzvorteil gegenüber anderen Datenstrukturen für die Darstellung von Mengen, z. B. selbstausgleichende binäre Suchbäume, Versuche, Hash-Tabellen oder einfache Arrays oder verknüpfte Listen der Einträge. Die meisten davon erfordern das Speichern mindestens der Datenelemente selbst, was von einer kleinen Anzahl von Bits für kleine Ganzzahlen bis zu einer beliebigen Anzahl von Bits, beispielsweise für Zeichenfolgen, erforderlich sein kann (Versuche sind eine Ausnahme, da sie den Speicher zwischen ihnen teilen können Elemente mit gleichen Präfixen). Verknüpfte Strukturen verursachen einen zusätzlichen linearen Raumaufwand für Zeiger. Ein Bloom-Filter mit 1% Fehler und einem optimalen Wert von k benötigt dagegen nur etwa 9,6 Bit pro Element - unabhängig von der Größe der Elemente. Dieser Vorteil beruht teilweise auf seiner Kompaktheit, die von Arrays geerbt wird. und teilweise von seiner probabilistischen Natur. Wenn eine 1% ige Falsch-Positiv-Rate zu hoch erscheint, verringern wir sie jedes Mal, wenn wir etwa 4,8 Bit pro Element hinzufügen, um das Zehnfache.

Ziemlich klar für mich.

Ein Bloom-Filter speichert die Elemente selbst nicht, dies ist der entscheidende Punkt. Sie verwenden keinen Bloom-Filter, um zu testen, ob ein Element vorhanden ist, sondern um zu testen, ob es mit Sicherheit nicht vorhanden ist, da es keine falschen Negative garantiert. Auf diese Weise können Sie keine zusätzliche Arbeit für Elemente ausführen, die in einem Satz nicht vorhanden sind (z. B. Festplatten-E / A, um sie nachzuschlagen).

Und das alles auf deutlich weniger Platz als so etwas wie eine Hash-Tabelle (die sich bei großen Datenmengen wahrscheinlich teilweise auf der Festplatte befindet). Sie können zwar einen Bloom-Filter in Verbindung mit einer Struktur wie einer Hash-Tabelle verwenden, aber sobald Sie sicher sind, dass das Element möglicherweise vorhanden ist.

Ein Beispiel für ein Verwendungsmuster könnte also sein:

Sie haben viele Daten auf der Festplatte - Sie entscheiden, welche Fehlergrenze Sie möchten (z. B. 1%), die den Wert von m vorschreibt . Dann wird das optimale k bestimmt (aus der im Artikel angegebenen Formel). Sie füllen Ihren Filter einmal aus diesen festplattengebundenen Daten.

Jetzt haben Sie den Filter im RAM. Wenn Sie ein Element verarbeiten müssen, fragen Sie Ihren Filter ab, um festzustellen, ob er möglicherweise in Ihrem Datensatz vorhanden ist. Wenn dies nicht der Fall ist, wird keine zusätzliche Arbeit geleistet. Keine Festplattenlesevorgänge usw. (Was Sie tun müssten, wenn es sich um einen Hash oder Baum usw. handeln würde).

Wenn der Filter andernfalls "Ja, es ist da drin" anzeigt, besteht eine 1% ige Wahrscheinlichkeit, dass es falsch ist, sodass Sie die erforderlichen Arbeiten ausführen, um dies herauszufinden. In 99% der Fälle wird es wirklich da sein, also war die Arbeit nicht umsonst.


2
Wenn es klar ist, antworten Sie bitte. Wie könnte dies möglicherweise platzsparender sein als eine einzelne Hash-Funktion bei gleichem Set? Dies führt einfach zu mehr Kollisionen. Sie werden nach separaten Hash-Funktionen suchen, um sicherzustellen, dass Sie bei allen Hash-Funktionen eine 1 haben. Ich verstehe nicht, dass es gegenüber der Verwendung einer einzelnen Hash-Funktion von Vorteil ist.
Kopfschmerzen

19
Eine Hash-Funktion ist Code, keine Daten. Womit wollen Sie die Hash-Funktion verwenden? Eine Hash-Tabelle? In diesem Fall muss Ihre Tabelle Schlüssel speichern, die im Gegensatz zu einem Bloom-Filter eine beliebige Größe haben können. Der Auszug erwähnt dies.
Alex Budovski

3
Betrachten Sie einen Bloom-Filter mit nur einer Hash-Funktion anstelle von k. Was ist der Vorteil beim Hinzufügen weiterer Hash-Funktionen? Dies führt einfach zu mehr Kollisionen. Oder liege ich falsch?
Kopfschmerzen

2
Dies wird durch den letzten Absatz unter "Raum- und Zeitvorteile" im Wikipedia-Artikel und den Abschnitt "Wahrscheinlichkeit falsch positiver Ergebnisse" beantwortet.
Alex Budovski

4
Es hat nur geklickt. Vielen Dank, das hat mich eine Weile nervt. Es verringert die Anzahl der falsch positiven Ergebnisse, da ein falsch positives Ergebnis entweder a) eine Kollision mit all Ihren Hash-Funktionen sein muss oder b) alle Leerzeichen mit anderen Werten gefüllt wurden. Die Wahl der Größe muss dann wohl ein schwieriger Prozess sein. Korrigieren Sie mich, wenn ich falsch liege, aber ich glaube, ich verstehe. Danke an alle.
Kopfschmerzen

156

Alex hat es ziemlich gut erklärt. Für diejenigen, die es noch nicht richtig verstanden haben, hilft dieses Beispiel hoffentlich beim Verständnis:

Nehmen wir an, ich arbeite für Google im Chrome-Team und möchte dem Browser eine Funktion hinzufügen, die den Benutzer benachrichtigt, wenn die von ihm eingegebene URL eine schädliche URL ist. Ich habe also einen Datensatz mit ungefähr 1 Million schädlichen URLs, wobei die Größe dieser Datei ungefähr 25 MB beträgt. Da die Größe ziemlich groß ist (groß im Vergleich zur Größe des Browsers selbst), speichere ich diese Daten auf einem Remote-Server.

Fall 1: Ich verwende eine Hash-Funktion mit einer Hash-Tabelle. Ich entscheide mich für eine effiziente Hashing-Funktion und führe alle 1 Million URLs durch die Hashing-Funktion, um Hash-Schlüssel zu erhalten. Ich erstelle dann eine Hash-Tabelle (ein Array), in der der Hash-Schlüssel mir den Index zum Platzieren dieser URL geben würde. Sobald ich die Hashing-Tabelle gehasht und gefüllt habe, überprüfe ich ihre Größe. Ich habe alle 1 Million URLs zusammen mit ihren Schlüsseln in der Hash-Tabelle gespeichert. Die Größe beträgt also mindestens 25 MB. Diese Hash-Tabelle wird aufgrund ihrer Größe auf einem Remote-Server gespeichert. Wenn ein Benutzer vorbeikommt und eine URL in die Adressleiste eingibt, muss ich überprüfen, ob diese böswillig ist. Daher führe ich die URL über die Hash-Funktion aus (der Browser selbst kann dies tun) und erhalte einen Hash-Schlüssel für diese URL. Ich muss jetzt mit diesem Hash-Schlüssel eine Anfrage an meinen Remote-Server stellen. Um zu überprüfen, ob die bestimmte URL in meiner Hash-Tabelle mit diesem bestimmten Schlüssel mit der vom Benutzer eingegebenen übereinstimmt. Wenn ja, dann ist es bösartig und wenn nein, dann ist es nicht bösartig. Daher muss jedes Mal, wenn der Benutzer eine URL eingibt, eine Anfrage an den Remote-Server gestellt werden, um zu überprüfen, ob es sich um eine schädliche URL handelt. Dies würde viel Zeit in Anspruch nehmen und somit meinen Browser verlangsamen.

Fall 2: Ich benutze einen Blütenfilter. Die gesamte Liste von 1 Million URLs wird mithilfe mehrerer Hash-Funktionen durch den Bloom-Filter geleitet, und die jeweiligen Positionen werden in einem großen Array von Nullen als 1 markiert. Angenommen, wir möchten eine falsch positive Rate von 1% mithilfe eines Bloom-Filter-Rechners ( http://hur.st/bloomfilter?n=1000000&p=0.01)) erhalten wir die Größe des benötigten Bloom-Filters als nur 1,13 MB. Diese kleine Größe wird erwartet, da wir, obwohl die Größe des Arrays sehr groß ist, nur 1s oder 0s speichern und nicht die URLs wie im Fall der Hash-Tabelle. Dieses Array kann als Bit-Array behandelt werden. Das heißt, da wir nur zwei Werte 1 und 0 haben, können wir einzelne Bits anstelle von Bytes setzen. Dies würde den Platzbedarf um das Achtfache reduzieren. Dieser 1,13 MB große Bloom-Filter kann aufgrund seiner geringen Größe im Webbrowser selbst gespeichert werden !! Wenn also ein Benutzer vorbeikommt und eine URL eingibt, wenden wir einfach die erforderlichen Hash-Funktionen (im Browser selbst) an und überprüfen alle Positionen im Bloom-Filter (der im Browser gespeichert ist). Ein Wert von 0 an einer der Positionen sagt uns, dass diese URL definitiv NICHT in der Liste der schädlichen URLs enthalten ist und der Benutzer frei vorgehen kann. Daher haben wir den Server nicht angerufen und damit Zeit gespart. Der Wert 1 gibt an, dass sich die URL möglicherweise in der Liste der schädlichen URLs befindet. In diesen Fällen rufen wir den Remote-Server an und können dort eine andere Hash-Funktion mit einer Hash-Tabelle verwenden, wie im ersten Fall, um die URL abzurufen und zu überprüfen, ob sie tatsächlich vorhanden ist. Da eine URL in den meisten Fällen nicht böswillig ist, ermittelt der kleine Bloom-Filter im Browser dies und spart Zeit, indem Anrufe an den Remote-Server vermieden werden. Nur in einigen Fällen, wenn der Bloom-Filter anzeigt, dass die URL möglicherweise schädlich ist, rufen wir nur in diesen Fällen den Server an. Das könnte 99% richtig sein. In diesen Fällen rufen wir den Remote-Server an und können dort eine andere Hash-Funktion mit einer Hash-Tabelle verwenden, wie im ersten Fall, um die URL abzurufen und zu überprüfen, ob sie tatsächlich vorhanden ist. Da es sich in den meisten Fällen nicht um eine böswillige URL handelt, ermittelt der kleine Bloom-Filter im Browser dies und spart Zeit, indem Anrufe an den Remote-Server vermieden werden. Nur in einigen Fällen, wenn der Bloom-Filter anzeigt, dass die URL möglicherweise schädlich ist, rufen wir nur in diesen Fällen den Server an. Das könnte 99% richtig sein. In diesen Fällen rufen wir den Remote-Server an und können dort eine andere Hash-Funktion mit einer Hash-Tabelle verwenden, wie im ersten Fall, um die URL abzurufen und zu überprüfen, ob sie tatsächlich vorhanden ist. Da es sich in den meisten Fällen nicht um eine böswillige URL handelt, ermittelt der kleine Bloom-Filter im Browser dies und spart Zeit, indem Anrufe an den Remote-Server vermieden werden. Nur in einigen Fällen, wenn der Bloom-Filter anzeigt, dass die URL möglicherweise schädlich ist, rufen wir nur in diesen Fällen den Server an. Das könnte 99% richtig sein. Der kleine Bloom-Filter im Browser stellt dies fest und spart somit Zeit, indem Anrufe an den Remote-Server vermieden werden. Nur in einigen Fällen, wenn der Bloom-Filter anzeigt, dass die URL möglicherweise schädlich ist, rufen wir nur in diesen Fällen den Server an. Das könnte 99% richtig sein. Der kleine Bloom-Filter im Browser stellt dies fest und spart somit Zeit, indem Anrufe an den Remote-Server vermieden werden. Nur in einigen Fällen, wenn der Bloom-Filter anzeigt, dass die URL möglicherweise schädlich ist, rufen wir nur in diesen Fällen den Server an. Das könnte 99% richtig sein.

Durch die Verwendung eines kleinen Bloom-Filters im Browser haben wir viel Zeit gespart, da wir nicht für jede eingegebene URL Serveraufrufe tätigen müssen.

Wir können sehen, dass die Hash-Tabelle mit einer einzelnen Hash-Funktion für einen anderen Zweck verwendet wird als ein Bloom-Filter. Hoffentlich klärt dies deine Zweifel :)

bearbeiten :

Ich habe einen Bloom-Filter für die Aufgabe des Testens böswilliger URLs in Python implementiert. Den Code finden Sie hier - https://github.com/tarunsharma1/Bloom-Filter Der Code ist sehr einfach zu verstehen und eine detaillierte Beschreibung finden Sie in der Readme-Datei.


3
Vielen Dank für ein Anwendungsszenario.
Squiggs.

1
Ich habe den Teil des Hashens und Zuordnens eines Werts von 0 oder 1 nicht erhalten. Wenn wir ein Array verwenden und 0 und 1 in diesen speichern, wie suchen wir dann nach dem Hashwert einer URL, wenn wir den Test durchführen ?
Divinedragon

1
Im Grunde genommen verwenden wir eine sogenannte Hash-Funktion, die die URL als Zeichenfolge aufnimmt und eine Zahl ausgibt. Wir verwenden diese Zahl und setzen den entsprechenden Array-Indexwert auf 1. Es gibt eine Reihe verschiedener Hashing-Funktionen. Wichtig ist jedoch, dass jedes Mal, wenn dieselbe URL durch eine Hashing-Funktion geleitet wird, dieselbe Nummer generiert werden muss. Ein Beispiel für eine Hashing-Funktion könnte darin bestehen, die ASCII-Werte aller Zeichen in einer URL zu addieren. In Bloom-Filtern verwenden wir viele Hashing-Funktionen und setzen alle diese Array-Indexwerte auf 1. Ich hoffe, dies hat Ihre Zweifel ausgeräumt.
Tarun

1
Eine herkömmliche Hashtabelle wie C # HashSet<String>verwendet im besten Fall, in dem die Hashtabelle vollständig gefüllt ist, 16 Bytes pro Elementelement: 4 Bytes werden von einem "Bucket" einem Eintrag in einer Eintragstabelle zugeordnet (einem Array-gepackten, einfach verknüpften Element) list), 4 Bytes für den zwischengespeicherten Hashcode, 4 Bytes für den "nächsten" Zeiger, 4 Bytes für einen Zeiger auf den Schlüssel. Und das zählt nicht die Saitengrößen. Im schlimmsten Fall sind es 40 Bytes: Die Hälfte der Einträge wird nicht verwendet und 20 Bytes pro Eintrag, sobald der StringZeiger für 64-Bit-Architekturen auf 8 Bytes erweitert wird.
Qwertie

Sie müssen den String selbst nicht im Hash-Set speichern. Sie können den Hash als Wert speichern, wodurch das Hashset viel kleiner wird. Dann können Sie mit der Hash-Größe spielen - je größer sie ist, desto geringer ist die Falsch-Positiv-Rate.
user1028741

24

Ich beginne mit der Erklärung, was ein Bloom-Filter ist, was er kann und was nicht, warum wir ihn brauchen, zeige eine intuitive Beschreibung seiner Funktionsweise und gebe dann ein Beispiel, wenn sie nützlich sein können.

Ein Standard-Bloom-Filter ist also eine probabilistische Datenstruktur , die * :


  • Element zu einer Menge hinzufügen
  • Überprüfen Sie, ob sich ein Element in der Menge befindet, indem Sie definitely not in the setoder mitteilenpossibly in the set

Das possibly in the setist genau , warum es probabilistische genannt. Mit intelligenten Worten bedeutet dies, dass falsch positive Ergebnisse möglich sind (es kann Fälle geben, in denen fälschlicherweise angenommen wird, dass das Element positiv ist), aber falsch negative Ergebnisse sind unmöglich.

Aber es kann nicht * :

  • Entferne einen Gegenstand aus dem Set
  • Geben Sie eine Liste aller Elemente an, die sich derzeit in Ihrem Set befinden

* Dieser Satz von Dosen / Dosen ist für einen einfachen Blütenfilter vorgesehen. Da es sich um eine nützliche Datenstruktur handelt, die vor langer Zeit erstellt wurde, haben die Benutzer herausgefunden, wie sie mit anderen nützlichen Funktionen erweitert werden kann.


Aber Moment mal: Wir kennen bereits eine Datenstruktur, die all dies ohne vage "möglich" und auch ohne alle Einschränkungen beantworten kann (kann nicht entfernen, kann nicht alle anzeigen). Und es heißt Set . Und hier kommt ein Hauptvorteil eines Bloom-Filters: Er ist platzsparend und platzkonstant .

Dies bedeutet, dass es keine Rolle spielt, wie viele Elemente wir dort speichern, der Speicherplatz ist der gleiche. Ja, ein Bloom-Filter mit 10^6Elementen (nutzloser Bloom-Filter) benötigt denselben Platz wie ein Bloom-Filter mit 10^20Elementen und denselben Platz wie ein Bloom-Filter mit 0Elementen. Wie viel Platz wird es brauchen? Es liegt an Ihnen zu entscheiden (aber es gibt einen Handel mit: Je mehr Elemente Sie haben, desto unsicherer sind Sie bei Ihrer possible in the setAntwort.

Eine andere coole Sache ist, dass es Raumkonstante ist. Wenn Sie die Daten in einem Satz speichern, müssen Sie diese Daten tatsächlich speichern. Wenn Sie also speichern this long string in the set, müssen Sie mindestens 27 Byte Speicherplatz verwenden. Für einen Fehler von 1% und einen optimalen Wert von k ** benötigen Sie jedoch ~ 9,6 Bit (<2 Byte) pro Element (unabhängig davon, ob es sich um ein kurzes int oder eine große Textwand handelt).

Eine weitere Eigenschaft ist, dass alle Operationen eine konstante Zeit benötigen, was absolut nicht mit der amortisierten konstanten Zeit bei Sätzen identisch ist (denken Sie daran, dass sich der Satz bei Kollisionen mit der O(n)Zeit verschlechtern kann).

** k ist ein Wert der im Bloom-Filter verwendeten Hash-Funktionen


Ich werde nicht beschreiben, wie die Bloom-Filter funktionieren (der Wikipedia-Artikel erklärt sehr gut alles). Hier werde ich nur kurz die Grundlagen erklären.

  • Sie initiieren ein leeres Bit-Array mit einer Länge m
  • Sie wählen kverschiedene Hash-Funktionen aus (je unabhängiger desto besser)
  • Wenn Sie ein Element hinzufügen möchten, berechnen Sie alle kHashes dieses Werts und setzen die entsprechenden Bits auf 1
  • Wenn Sie überprüfen möchten, ob ein Element vorhanden ist, berechnen Sie auch alle kHashes. Wenn mindestens eines davon nicht festgelegt ist, befindet es sich sicherlich nicht im Satz. Ansonsten kann es im Set sein.

Selbst diese Beschreibung reicht aus, um zu verstehen, warum wir nicht sicher sein können (Sie können alle Bits von verschiedenen anderen Werten setzen lassen). Hier ist eine sehr schöne Visualisierung, wie es funktioniert .

Geben Sie hier die Bildbeschreibung ein


Wann können Bloom-Filter nützlich sein? Die kurze Antwort ist überall dort, wo falsch positive Ergebnisse akzeptabel sind und wo Sie überprüfen möchten, ob sich etwas im Set befindet. Selbst wenn dies nicht der Fall ist, kann es eine erste Verteidigungslinie sein, teure Anrufe bei Verifizierern auszuschließen.

Hier ist eine Liste konkreterer Beschreibungen:

  • Ein Standardbeispiel für bösartige Websites und einen Browser wird an fast jedem Ort beschrieben, an dem über Bloom-Filter gesprochen wird
  • ist ein Passwort schwach: Anstatt eine große Menge aller möglichen schwachen Passwörter zu haben, können Sie einfach mit einem viel kleineren Bloom-Filter überprüfen, ob das Passwort sicher nicht schwach ist
  • Wenn Sie eine Liste mit Artikeln und eine Liste mit Benutzern haben, können Sie den Bloom-Filter verwenden, um die Artikel der Benutzer anzuzeigen, die sie nicht gelesen haben. Interessant ist, dass Sie nur einen Filter haben können (Sie prüfen, ob die Kombination aus user_id + article_id vorhanden ist).
  • Bitcoin verwendet den Bloom-Filter für die Brieftaschensynchronisation
  • Die Webserver von Akamai verwenden Bloom-Filter, um zu verhindern, dass "One-Hit-Wonders" in den Festplatten-Caches gespeichert werden. One-Hit-Wonders sind Webobjekte, die von Benutzern nur einmal angefordert wurden. Akamai stellte fest, dass dies für fast drei Viertel ihrer Caching-Infrastruktur gilt. Die Verwendung eines Bloom-Filters zum Erkennen der zweiten Anforderung für ein Webobjekt und das Zwischenspeichern dieses Objekts nur bei seiner zweiten Anforderung verhindert, dass One-Hit-Wunder in den Festplatten-Cache gelangen, wodurch die Festplatten-Workload erheblich reduziert und die Trefferquote für den Festplatten-Cache erhöht wird (siehe Beispiele im Bloom-Filter) Artikel im Wiki)

13

Bloom-Filter sind in der Bioinformatik sehr nützlich. Sie können platzsparender sein als die Verwendung eines normalen Hashs, insbesondere wenn die Größe der Zeichenfolgen, mit denen Sie arbeiten, Hunderte Millionen Buchstaben mit einem sehr kleinen Alphabet betragen kann, dh {A, G, T, C}. Sie werden normalerweise verwendet, um zu beurteilen, ob ein bestimmtes k-mer in einem Genom vorhanden ist oder nicht. Es ist ein Beispiel für eine für etwas Relevantes verwendet hier .

BEARBEITEN:

Die mehreren Hash-Funktionen werden verwendet, um Fehlalarme zu minimieren. Die Hoffnung ist, dass zwischen allen k-Hash-Funktionen jeder Wert im Vergleich zu jedem anderen möglichen Wert eine eindeutige Signatur im Bit-Array hat. Es gibt zwar falsch positive Ergebnisse, diese können jedoch auf ein überschaubares Maß minimiert werden. Mit dieser Technik hashen Sie Elemente unabhängig von ihrer Größe. Wenn Sie nach ihnen suchen, verwenden Sie jede Hash-Funktion und überprüfen, ob ihre Bitwerte alle 1 sind.

Vergleichen Sie dies mit dem menschlichen Genom, bei dem eine Vergrößerung des Elements die Größe der Hash-Tabelle signifikant erhöht (die Tabellengröße beträgt 4 * 4 k ). Dies setzt voraus, dass Sie die Elemente mit 2 Bits / Buchstaben codieren.


1
Entschuldigung, vielleicht verstehe ich das falsch, aber wie können sie im Vergleich zu einem normalen Hash platzsparender sein? Der Hash eines Strings ist eine Ausgabe mit fester Länge, und Sie setzen diesen Wert einfach auf 0 oder 1. Dies ist auch das, was Bloom-Filter tun würden, aber Bloom-Filter würden dies bei mehreren Hash-Funktionen tun . Wo bin ich falsch verstanden?
Kopfschmerzen

Es nützt nicht viel, nur einen einzelnen Hash zu speichern. Dann hätte es keine Möglichkeit, Hash-Kollisionen zu behandeln. Die meisten Hash-Tabellen-Implementierungen haben eine Möglichkeit, damit umzugehen, was Overhead verursacht. Python-Wörterbücher speichern beispielsweise den Schlüssel neben dem Hash und beginnen bei einer Kollision mit der linearen Prüfung. Der Bloom-Filter schneidet dies aus und versucht, den damit verbundenen Schaden durch die Verwendung mehrerer Hashes zu minimieren.
Bret Fontecchio

1
Warum nicht einen Bloom-Filter erstellen, aber mit nur einer Hash-Funktion? vielleicht "relativ große" Hash-Funktion. Aber einer statt viele
Giorgim

7

Wenn ein Bloom-Filter zurückgibt, dass ein Element Mitglied der Gruppe ist, besteht eine bestimmte Wahrscheinlichkeit für ein falsches Positiv. Wenn nur eine einzige Hash-Funktion verwendet würde, um die Zugehörigkeit zum Satz anzuzeigen, wäre die Wahrscheinlichkeit eines falsch positiven Ergebnisses höher als bei Verwendung mehrerer Hash-Funktionen.


Benötigen Sie eine ernsthafte Ausarbeitung des Fleisches der Antwort: " Die Wahrscheinlichkeit eines falsch positiven
Ergebnisses
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.