Memahami Bloom Filter lewat Contoh
(llimllib.github.io)- Bloom filter adalah struktur data probabilistik yang efisien memori untuk memeriksa dengan cepat apakah suatu elemen ada di dalam himpunan
- Struktur ini hanya memberi tahu apakah elemen pasti tidak ada, atau mungkin ada di dalam himpunan, dan memiliki kemungkinan false positive
- Struktur dasarnya menggunakan vektor bit dan beberapa fungsi hash untuk mengatur bit yang sesuai dengan tiap elemen menjadi 1
- Tingkat kesalahan dan performa ditentukan oleh ukuran filter dan jumlah fungsi hash, sehingga bisa disesuaikan dengan kebutuhan penggunaan
- Juga diperkenalkan fungsi hash yang direkomendasikan serta cara menentukan konfigurasi optimal, efisiensi ruang, dan contoh penerapan nyata
Apa itu Bloom Filter
- Bloom filter adalah struktur data untuk menentukan dengan cepat dan efisien memori apakah suatu elemen ada di dalam himpunan tertentu
- Demi efisiensi ini, Bloom filter merupakan struktur data probabilistik, sehingga hasil pemeriksaannya terbagi menjadi "pasti tidak ada di dalam himpunan" atau "mungkin ada di dalam himpunan"
- Struktur inti Bloom filter adalah vektor bit
- Saat menambahkan elemen, setiap elemen di-hash beberapa kali lalu bit pada indeks tersebut diatur menjadi 1
- Jika bit pada indeks yang dihasilkan oleh tiap fungsi hash semuanya bernilai 1, maka elemen dinilai "mungkin ada"; jika tidak, maka diproses sebagai "pasti tidak ada"
Contoh prinsip kerja
- Beberapa fungsi hash (misalnya Fnv, Murmur) digunakan untuk memetakan elemen ke beberapa indeks bit
- Saat elemen ditambahkan, bit pada indeks yang dihitung diubah menjadi 1
- Saat memeriksa apakah elemen tertentu ada, jika semua indeks yang dihasilkan dengan fungsi hash yang sama dan cara yang sama bernilai 1, maka elemen dianggap "mungkin ada"
- Jika ada satu saja bit terkait yang bernilai 0, maka bisa dipastikan elemen itu "tidak ada di dalam himpunan"
- Karena itu, muncul kemungkinan false positive
Topik lanjutan
Perhatian: penulis sebenarnya tidak memiliki pengalaman menerapkan Bloom filter pada layanan berskala besar
Pemilihan fungsi hash
- Fungsi hash yang independen dan memiliki distribusi merata direkomendasikan
- Fungsi hash kriptografis (seperti sha1) tidak cocok karena lambat
- Contoh fungsi hash yang cepat dan sederhana: Murmur, xxHash, Fnv, HashMix, dan lain-lain
- Dalam kasus nyata, mengganti md5 ke murmur menghasilkan peningkatan kecepatan lebih dari 800%
Menentukan ukuran Bloom filter
- Semakin besar ukuran filter (m), semakin rendah tingkat false positive
- Tingkat false positive umumnya dapat didekati dengan (1-e^(-kn/m))^k
- Jumlah elemen yang diharapkan (n), ukuran filter (m), dan jumlah fungsi hash (k) harus ditentukan dengan tepat
Berapa jumlah fungsi hash?
- Semakin banyak fungsi hash, semakin lambat kecepatannya dan filter akan lebih cepat penuh
- Jika terlalu sedikit, tingkat false positive menjadi tinggi
- Nilai k yang ideal dihitung dengan (m/n)ln(2)
- Saat merancang, lakukan prosedur berikut:
- memperkirakan jumlah elemen yang diharapkan n
- menentukan jumlah bit m
- menghitung k yang optimal
- memeriksa apakah tingkat kesalahan yang diinginkan tercapai; jika tidak, sesuaikan m
Performa dan efisiensi ruang
- Pada Bloom filter, penambahan elemen/pemeriksaan keberadaan memiliki kompleksitas waktu O(k)
- Efisiensi ruang ditentukan oleh batas toleransi tingkat kesalahan dan rentang elemen
- Jika rentang elemen bahkan secara kasar pun tidak bisa diprediksi, hash table atau scalable Bloom filter mungkin lebih baik
Contoh penggunaan
- Untuk contoh penggunaan yang lebih rinci, lihat Wikipedia
- C. Titus Brown menunjukkan contoh penerapan Bloom filter dalam bioinformatika
Referensi
- Broder, Mitzenmacher : Network Applications of Bloom Filters: A Survey — makalah gambaran umum Bloom filter
- Wikipedia – Bloom Filter
- Kirsch, Mitzenmacher: Less Hashing, Same Performance
- Almeida dkk.: Scalable Bloom Filters
1 komentar
Komentar Hacker News
"bloom"dan"demonstrators "(termasuk spasi terakhir) bertabrakan pada fnv: 7, murmur: 12querySelector(), prefilter kamus lookup hash di bucket CSS, dan rapid reject saat menelusuri atribut Aria untuk aksesibilitas. Filter kecil 32-bit dan 64-bit juga benar-benar bekerja dengan baik. Bloom filter yang lebih besar juga dipakai secara tepat, dan saya sendiri pernah menambahkan fitur seperti ini secara langsung