لو عندك مليون مستخدم في تطبيقك، ومحتاج تجيب بيانات مستخدم واحد بـ ID، dict في Python بيرجّعهم في 0.5 ميكروثانية. لو خزّنتهم في list، نفس البحث ممكن ياخد 30 ميلي ثانية. ده فرق 60 ألف ضعف على نفس الجهاز ونفس البيانات. السر مش في السرعة، السر في هيكل بيانات اسمه HashMap.
ليه HashMap هو الأساس اللي مفيش مبرمج بيستغنى عنه
كل لما تكتب dictionary في Python، أو HashMap في Java، أو Map في JavaScript، أو object literal في JS، أنت بتستخدم HashMap. ده الهيكل الأكثر استخدامًا في البرمجة بعد الـ array. لو فهمته، هتفهم 70% من قرارات تصميم الكود اللي بتشوفها كل يوم.
المشكلة باختصار
لما بتدوّر على عنصر في list، Python بيقرأ كل عنصر واحد واحد لحد ما يلاقي اللي عايزه. ده اسمه Linear Search، وزمنه بيكبر مع حجم البيانات. على 100 عنصر، الفرق ميحسش. على مليون، التطبيق بيبدأ يبطئ بشكل واضح. على 100 مليون، الـ endpoint بيموت.
HashMap بيحل المشكلة دي بطريقة مختلفة جذريًا: بدل ما يبحث، بيحسب مكان العنصر مباشرة.
مثال بسيط: دفتر التليفون القديم
تخيل معايا دفتر تليفون ورقي عادي، فيه 5000 اسم مكتوبين بترتيب عشوائي. عشان تلاقي رقم خالد، بتفتح صفحة بعد صفحة، تقرأ كل الأسماء، لحد ما توصل لخالد. لو الأسماء 50000، نفس العملية بتاخد وقت أطول 10 أضعاف.
دلوقتي تخيل دفتر مختلف: في الأول فيه 28 خانة، واحدة لكل حرف من حروف الأبجدية. كل اسم بيتكتب في خانة الحرف الأول بتاعه. عشان تلاقي خالد، بتروح خانة "خ" دايركت. لو الخانة فيها 5 أسامي، بتقرأهم بسرعة. مفيش بحث صفحة بصفحة.
ده بالظبط فكرة الـ HashMap. الخانات اسمها buckets، والقاعدة اللي بتحدد الخانة اسمها hash function. الفرق الوحيد إن HashMap الحقيقي عنده آلاف الـ buckets مش 28.
التعريف العلمي بالظبط
HashMap هو هيكل بيانات بيخزّن أزواج (key, value). لما تضيف زوج جديد بيحصل التالي:
- بياخد الـ key (مثلاً "user_999000").
- بيمرّره على دالة Hash Function. الدالة بترجع رقم كبير (مثلاً 8237461923).
- بياخد باقي القسمة على عدد الـ buckets (مثلاً 1024). النتيجة: index من 0 لـ 1023.
- بيحط الـ value في الـ bucket ده.
لما تجيب الـ value: نفس الـ key يمر على نفس الدالة، ترجع نفس الرقم، تروح للـ bucket دايركت. زمن البحث ثابت تقريبًا. مش مهم البيانات 10 ولا مليون - الزمن واحد. ده اللي اسمه O(1) Average Time Complexity.
كود Python شغّال تقدر تنسخه
السكربت ده بيقارن dict مع list على مليون عنصر. شغّله على جهازك وشوف الفرق بنفسك: