Alex bunu oldukça iyi açıkladı. Hala tam olarak kavrayamayanlar için, umarım bu örnek anlamanıza yardımcı olur:
Diyelim ki Chrome ekibinde Google için çalışıyorum ve tarayıcıya, girdiği url'nin kötü niyetli bir URL olup olmadığını bildiren bir özellik eklemek istiyorum. Bu yüzden yaklaşık 1 milyon kötü amaçlı URL'den oluşan bir veri kümem var ve bu dosyanın boyutu yaklaşık 25MB. Boyut oldukça büyük olduğu için (tarayıcının kendisinin boyutuna kıyasla büyük), bu verileri uzak bir sunucuda depoluyorum.
Durum 1: Karma tablo ile bir karma işlevi kullanıyorum. Verimli bir hashing fonksiyonuna karar veriyorum ve hash anahtarları almak için hashing fonksiyonu aracılığıyla 1 milyon url'nin tamamını çalıştırıyorum. Daha sonra, hash anahtarının bana bu URL'yi yerleştirmek için dizini vereceği bir karma tablo (bir dizi) oluşturuyorum. Şimdi, hashing tablosunu bir kez karma haline getirip doldurduktan sonra, boyutunu kontrol ediyorum. 1 milyon URL’yi anahtarlarıyla birlikte hash tablosunda sakladım. Yani boyut en az 25 MB. Bu karma tablo, boyutu nedeniyle uzak bir sunucuda saklanacaktır. Bir kullanıcı gelip adres çubuğuna bir URL girdiğinde, kötü amaçlı olup olmadığını kontrol etmem gerekiyor. Bu yüzden URL'yi hash fonksiyonu aracılığıyla çalıştırıyorum (tarayıcının kendisi bunu yapabilir) ve bu URL için bir hash anahtarı alıyorum. Şimdi uzak sunucuma bu hash anahtarıyla bir istekte bulunmam gerekiyor, hash tablomdaki belirli URL’nin bu anahtarla kullanıcının girdiği URL ile aynı olup olmadığını kontrol etmek için. Eğer evet ise kötü niyetli, hayır ise kötü niyetli değil. Bu nedenle, kullanıcı bir URL'yi her girdiğinde, kötü amaçlı bir URL olup olmadığını kontrol etmek için uzak sunucuya bir istek yapılması gerekir. Bu çok zaman alır ve bu nedenle tarayıcımı yavaşlatır.
Durum 2: Çiçeklenme filtresi kullanıyorum. 1 milyon URL'nin tamamı, çoklu karma işlevler kullanılarak çiçek filtresinden geçirilir ve ilgili konumlar, büyük bir 0'lar dizisinde 1 olarak işaretlenir. Çiçeklenme filtresi hesaplayıcısı kullanarak% 1'lik bir yanlış pozitif oranı istediğimizi varsayalım ( http://hur.st/bloomfilter?n=1000000&p=0.01), gerekli olan çiçeklenme filtresinin boyutunu yalnızca 1,13 MB olarak alıyoruz. Dizinin boyutu çok büyük olmasına rağmen, hash tablosundaki gibi URL'leri değil, yalnızca 1'leri veya 0ları depoladığımız için bu küçük boyut beklenir.Bu dizi bir bit dizisi olarak değerlendirilebilir. Yani, sadece 1 ve 0 değerimiz olduğu için, bayt yerine ayrı bitler ayarlayabiliriz. Bu, kaplanan alanı 8 kat azaltacaktır. Bu 1,13 MB çiçeklenme filtresi, küçük boyutu nedeniyle web tarayıcısında saklanabilir !! Bu nedenle, bir kullanıcı gelip bir URL girdiğinde, gerekli hash işlevlerini (tarayıcının kendisinde) uygularız ve çiçek filtresindeki (tarayıcıda saklanan) tüm konumları kontrol ederiz. Konumların herhangi birinde 0 değeri bize bu URL'nin KESİNLİKLE kötü amaçlı URL'ler listesinde OLMADIĞINI ve kullanıcının serbestçe ilerleyebileceğini söyler. Böylece sunucuya bir çağrı yapmadık ve dolayısıyla zamandan tasarruf ettik. 1 değeri bize URL'nin kötü amaçlı URL'ler listesinde OLABİLECEĞİNİ söyler. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. tarayıcıdaki küçük çiçeklenme filtresi bunu belirler ve böylece uzak sunucuya yapılan çağrılardan kaçınarak zamandan tasarruf sağlar. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. tarayıcıdaki küçük çiçeklenme filtresi bunu belirler ve böylece uzak sunucuya yapılan çağrılardan kaçınarak zamandan tasarruf sağlar. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru.
Bu nedenle, tarayıcıda küçük bir çiçeklenme filtresi kullanarak, girilen her URL için sunucu çağrıları yapmamıza gerek olmadığından çok zaman kazandık.
Tek bir hash işlevine sahip karma tablonun bir çiçek filtresinden tamamen farklı bir amaç için kullanıldığını görebiliriz. Umarım bu şüphelerinizi giderir :)
düzenle :
Python'da kötü amaçlı URL testi görevi için bir çiçeklenme filtresi uyguladım. Kod burada bulunabilir - https://github.com/tarunsharma1/Bloom-Filter
Kodun anlaşılması çok basittir ve benioku dosyasında ayrıntılı bir açıklama sağlanır.