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.