İki veri yapısının karma çarpışmalarla nasıl başa çıktığı eksik. Bloom filtreleri gerçek değerleri depolamaz, bu nedenle gerekli alan belirlenen dizinin sabit boyutudur. Bunun yerine geleneksel bir karma kullanırsanız, verdiğiniz tüm değerleri depolamaya çalışır, böylece zamanla büyür.
Basitleştirilmiş bir karma işlevini düşünün (sadece örnek için!) f(x) = x % 2. Şimdi giriş aşağıdaki tamsayılar: 2, 3, 4, 5, 6, 7.
Standart Hash: Verilen değerler hash edilecektir ve bu nedenle çok sayıda çarpışma ile sonuçlanıyoruz.f(2) = f(4) = f(6) = 0 ve f(3) = f(5) = f(7) = 1. Bununla birlikte, karma tüm bu değerleri depolar ve 8içinde saklanmadığını söyleyebilir. Bunu nasıl yapıyor? Çarpışmaları izler ve tüm değerleri aynı karma değerle depolar, ardından sorguladığınızda, ek olarak sorgunuzu karşılaştırır. Bu yüzden haritayı şu şekilde sorgulayalım 8: f(8) = 0bu nedenle, daha önce eklediğimiz bir kovaya bakacağız ve bunun girişin bir parçası olmadığını 2, 4, 6söylemek için 3 karşılaştırma yapması gerekiyor 8.
Bloom filtresi: Normalde, her bir giriş değeri kfarklı hash işlevlerine karşı hash edilir. Yine, basitlik için, sadece tek hash fonksiyonunu kullandığımızı varsayalım f. Daha sonra 2 değer dizisi ihtiyaç ve biz girdi karşılaştığınızda 2bunun nedeni demektir f(2) = 0biz pozisyonda dizi değerini 0değere 1. Aynı şey 4ve için de geçerlidir 6. Benzer şekilde, girdiler3, 5, 7 her biri dizi konumunu 1değere ayarlar 1. Şimdi biz sorgu 8giriş parçası: f(8) = 0pozisyonundaki dizi 0olduğunu 1, bu nedenle çiçek filtre olacak yanlış İstem 8gerçekten giriş parçasıydı.
Biraz daha gerçekçi olmak için ikinci bir hash fonksiyonu eklediğimizi düşünelim g(x) = x % 10. Bunun üzerine, giriş değeri 2iki karma değerlerine yol açar f(2) = 0ve g(2) = 2ve bunlara karşılık gelen iki dizi pozisyonu ayarlanacak1 . Tabii ki, dizi şimdi en azından boyutta olmalıdır 10. Ancak sorguladığımızda 8diziyi konumu 8nedeniyle kontrol edeceğiz g(8) = 8ve bu konum hala devam edecek 0. Bu nedenle ek karma işlevler, alacağınız yanlış pozitifleri azaltır.
Karşılaştırma: Bloom filtresi, rasgele dizi konumlarına erişildiği kanlamına gelen sağlama işlevlerini kullanır k. Ama bu rakam kesin. Bunun yerine karma yalnızca size amortismanlı sabit bir erişim süresi garanti eder, ancak karma işlevinizin ve giriş verilerinizin niteliğine bağlı olarak üretimini kaldırabilir. Bu nedenle, oluşturulmuş olgular dışında genellikle daha hızlıdır.
Ancak, bir karma çarpışmanız olduğunda standart karma, saklanan değerlerin sorgu değerine eşitliğini kontrol etmelidir. Bu eşitlik kontrolü keyfi olarak pahalı olabilir ve asla bir çiçek filtresi ile gerçekleşmez.
Alan açısından, çiçeklenme filtresi sabittir, çünkü belirlenen diziden daha fazla bellek kullanmaya hiç gerek yoktur. Öte yandan, karma dinamik olarak büyür ve çarpışan değerleri takip etmek zorunda kaldığı için çok daha büyük olabilir.
Değiş tokuş: Artık neyin ucuz olduğunu ve neyin olmadığını ve hangi koşullar altında değiştiğini bildiğinize göre ödünleşmeyi görebilmelisiniz. Bloom filtreleri, daha önce bir değerin görüldüğünü çok hızlı bir şekilde tespit etmek istiyorsanız, ancak yanlış pozitiflerle yaşayabiliyorsanız harika. Öte yandan, çalışma zamanınızı tam olarak değerlendirememe fiyatında garantili doğruluk istiyorsanız, ancak ortalamanın çok daha yavaş olabileceği zaman zaman dejenere olmuş vakaları kabul edebileceğiniz karma haritayı seçebilirsiniz.
Benzer şekilde, sınırlı bir bellek ortamındaysanız, bellek kullanım garantisi için bloom filtrelerini tercih etmek isteyebilirsiniz.