المستوى: متوسط
Bloom Filters بالعربي: قول "مش موجود" في O(1) بدون لمس قاعدة البيانات
لو كل request على الـ API بتاعك بيعدّي على PostgreSQL عشان يتأكد إن username مش متسجّل قبل كده، أنت بتدفع 4 إلى 12 ميلي ثانية على كل طلب لمجرّد إجابة "موجود ولا لأ". Bloom Filter بيرد على نفس السؤال في أقل من 50 ميكروثانية، باستخدام ذاكرة أقل بـ 70 إلى 90% من cache عادي. الثمن: نسبة false positive بسيطة ومضبوطة من البداية.
المشكلة باختصار
أكثر من 60% من الأسئلة اللي بتتبعت لقاعدة البيانات في تطبيقات ويب بترجع بإجابة "غير موجود". مستخدم بيدخل username عشان يسجّل، أو فحص لو URL ده اتزحف قبل كده، أو بحث على tag مش موجود. كل سؤال من دول بياخد روحة ورجعة كاملة على الـ DB حتى لو الإجابة لا. الثمن الحقيقي: ضغط زيادة على connection pool، latency على المستخدم، وفاتورة قاعدة بيانات أعلى بدون فايدة.
مثال بسيط جدًا قبل التعريف العلمي
تخيّل إنك بوّاب عمارة فيها 10 آلاف ساكن. لو كل واحد جايلك يسأل "ساكن فلان موجود؟" وأنت تروح تفتح كشف الأسماء كله وتدوّر، هتضيع كل يومك. الحل اللي البواب الذكي بيعمله: ماسك في إيده ورقة صغيرة فيها "حروف بداية أكيد مش موجودة" — يعني الحروف اللي مفيش اسم في العمارة بيبدأ بيها. أي حد يجي يسأل عن اسم بيبدأ بحرف من دول، يرد فورًا "أكيد مش هنا" بدون ما يفتح أي كشف.
دي بالظبط فكرة Bloom Filter: structure صغيرة في الذاكرة بترد بثقة كاملة "أكيد مش موجود"، أو ترد بحذر "غالبًا موجود — اتأكد من المصدر الأصلي". الردّ الأول مجاني تقريبًا، والتاني هو اللي بيكلفك query فعلي.
التعريف العلمي بدقة
Bloom Filter هو probabilistic data structure اخترعه Burton Howard Bloom سنة 1970. هو bit array بطول m، ومعاه k دوال hash مستقلة. لمّا تضيف عنصر، بتشغّل k hashes عليه، وكل hash بيرجّع index بين 0 و m-1، وبتحوّل البت في الـ index ده لـ 1.
لمّا تستفسر عن عنصر، بتشغّل نفس الـ k hashes. لو أي بت من الـ k قيمته 0، فالعنصر أكيد مش متخزّن (zero false negatives). لو كل البتات قيمتها 1، فالعنصر غالبًا متخزّن، مع احتمال false positive محسوب مسبقًا.
المعادلة المضبوطة للنسبة: p ≈ (1 - e^(-kn/m))^k، حيث n عدد العناصر المضافة. القيمة المثلى لـ k هي (m/n) × ln(2). بمعنى: لو حددت m و n، المكتبة هتختار k المثالي تلقائيًا.
كود Python شغّال — احسب وطبّق
الافتراض: بتستخدم Python 3.10+ و pip. هنبني filter لـ مليون username بنسبة false positive 1%.
pip install pybloom-live==4.0.0