المستوى المطلوب: متوسط
وقت القراءة المتوقّع: 9 دقائق.
لو عندك جدول فيه مليار URL ضارّ، وعايز تتأكد قبل ما المتصفح يفتح أي رابط إنه مش في القائمة، ما تقدرش تحمّل المليار في ذاكرة العميل. Bloom Filter بيحلّ المشكلة دي في 8 ميجا رام تقريبًا، وبيرد على السؤال "هل الرابط ده موجود؟" في أقل من ميكروثانية، بمعدل خطأ تحت 1%. ده نفس الهيكل اللي Chrome بيستخدمه في خدمة Safe Browsing من 2012، واللي Cassandra بتعتمد عليه في كل SSTable عندها.
Bloom Filter: المرشّح الاحتمالي اللي بيفرق في القرارات الكبيرة
المشكلة باختصار
تخيّل إنك بتبني خدمة مكافحة تصيّد. عندك قاعدة بيانات بمليار رابط مشكوك فيه. كل مرة المستخدم بيكتب URL في المتصفح، لازم تتأكد إنه مش موجود في القائمة قبل ما يدوس Enter.
- لو بعت كل URL للسيرفر، هتاكل شبكة هائلة وهتأخّر التحميل.
- لو حمّلت القائمة كلها على العميل، هتاكل 30 جيجا رام (مليار رابط × 30 بايت متوسّط).
- لو حطيتها في DB في الذاكرة، الـ p95 latency في الاستعلام هيعدّي 5 مللي ثانية لكل ضربة كيبورد.
Bloom Filter بيدّيك إجابة سريعة، محلية، بحجم صغير جدًا، مقابل تنازل واحد بسيط: ممكن في 1% من الحالات يقول "ربما موجود" لرابط مش موجود فعلًا. والـ 1% دي بتتحقّق بسؤال السيرفر، فمحدّش بيتضرّر.
المثال البسيط أولًا: موظف باب الحفلة
تخيّل حفلة فيها 500 مدعوّ. على الباب موظف عنده ورقة بـ 1000 خانة فاضية. كل ضيف يدخل، الموظف بياخد اسمه ويعمل عليه ثلاث طرق تحويل مختلفة (يقلب الحروف، يجمع أرقام، يدخل اسم الأم) فيطلع له ثلاثة أرقام بين 1 و 1000. يحط علامة "صح" في الخانات الثلاثة.
لمّا يجي شخص جديد ويدّعي إنه مدعوّ، الموظف يعمل نفس الطرق التلاتة على اسمه. لو أيّ خانة من التلاتة فاضية → الشخص ده حتمًا مش مدعوّ، يتطرد. لو الخانات التلاتة عليها علامة → ربما مدعوّ، يدخل.
لاحظ حاجة مهمة: الموظف ما عندوش قائمة الأسماء أصلاً. عنده 1000 خانة بس. وممكن يحصل إن واحد دخيل صادف إن أرقامه التلاتة كلها مكتوبة قبل كده من ضيوف تانيين، فيدخل غلط (false positive). لكن مستحيل ضيف حقيقي يتطرد، لأن الخانات بتاعته اتلوّنت يوم ما دخل أول مرة.
ده بالظبط اللي Bloom Filter بيعمله: ممكن يقول "موجود" لحد مش موجود، لكن مستحيل يقول "مش موجود" لحد فعلًا موجود. صفر false negatives. هذه الخاصية هي اللي بتخلّيه مفيد جدًا كطبقة قبل الـ DB.
التعريف العلمي الدقيق
الـ Bloom Filter (اقترحه Burton Howard Bloom سنة 1970 في مجلة CACM) هيكل بيانات احتمالي مكوّن من جزئين:
- bit array طوله
mبِت، كل البِتات مبدئيًا = 0. - k دالة hash مستقلة، كل واحدة بتاخد العنصر وترجّع رقم بين 0 و
m−1.
عند الإضافة (insert): بنحسب الـ k قيم hash للعنصر، ونحط 1 في كل المواضع الناتجة. عند الاستعلام (query): بنحسب نفس الـ k قيم. لو كل البِتات الـ k = 1 → "ربما موجود". لو واحد بس منهم 0 → "حتمًا غير موجود".