المستوى: مبتدئ
لو خدمة التسجيل عندك بتفحص 50 مليون username محجوز في PostgreSQL مع كل اقتراح اسم جديد، انت بتأكل 4 جيجا RAM وبتفتح 600 query/ثانية بدون لزمة. Bloom Filter بـ 60 ميجا RAM بيرد على نفس السؤال في 38 ميكروثانية، مع نسبة خطأ مضبوطة عند 1%.
Bloom Filter: data structure بتختصر 98% من الذاكرة
هتفهم في المقال ده data structure اسمها Bloom Filter بتحل مشكلة شائعة جدًا: "هل العنصر ده موجود في مجموعة كبيرة؟". هتشوف كود Python شغّال في 22 سطر، أرقام مقاسة على لابتوب فعلي، وحالات الفلتر يبقى فيها كارثة بدل ما يفيد. وقت القراءة المتوقع: 8 دقائق.
المشكلة باختصار
تخيّل تطبيق Twitter أو Instagram. كل ما حد يكتب username جديد في صفحة التسجيل، التطبيق محتاج يرد فورًا: "الاسم ده متاح ولا لأ؟". لو عندك 200 مليون مستخدم مسجّل، أي حل ساذج بيموت تحت الحمل.
الحل الأول الساذج: query على DB
كل keystroke بيفتح query على PostgreSQL:
SELECT 1 FROM users WHERE username = 'ahmed_dev' LIMIT 1;المشكلة: 600 طلب/ثانية × index lookup. الـ DB بتاخد 4ms في P95، الفاتورة بتطلع، والـ keystrokes المتلاحقة بتقطّع تجربة المستخدم.
الحل التاني: Redis SET
تحط كل الـ usernames في Redis SET، والـ SISMEMBER بيرجع في 200μs. أفضل من DB. بس Redis بياكل 4.2 جيجابايت RAM علشان يخزّن 50 مليون string متوسطها 16 حرف. ده غالي لو الـ instance بتاعك بـ 8 جيجا RAM.
مثال الحارس الأمني — قبل ما نشرح المفهوم
تخيّل حارس على باب نادي فيه قائمة بـ 50 ألف اسم ممنوع. عنده اختياران:
- الكتاب الكامل: كل ما يدخل حد، يفتح الكتاب ويقلّب 50 ألف اسم. دقيق 100%، بس بطيء جدًا، وممكن يتأخّر معاه طابور كبير على الباب.
- 14 sticker على باب الزجاج: كل ما يدخل حد، يبصّ على مجموعة stickers مرتبطة باسمه. لو واحد فيهم فاضي → الاسم 100% مش في القائمة، يدخل فورًا. لو كلهم متلوّنين → ممكن يكون في القائمة، يفتح الكتاب يتأكد.
الـ stickers ديه هي Bloom Filter. مساحة صغيرة، رد سريع، وفيه احتمال false positive مضبوط (مثلًا 1%): لون مصادفة بسبب أسماء تانية. بس مفيش false negative أبدًا: لو sticker فاضي، الاسم 100% مش موجود.
التعريف العلمي
Bloom Filter اخترعها Burton Howard Bloom في ورقة "Space/Time Trade-offs in Hash Coding with Allowable Errors" (Communications of the ACM, July 1970). هي عبارة عن:
- Bit array بحجم
mبت (كلهم أصفار في البداية).