HashMap حاوية يمكن استخدامها لتخزين أزواج المفتاح والقيمة. في لغات البرمجة الأخرى، تُسمّى بنية البيانات هذه أحيانًا المصفوفة الترابطية أو جدول التجزئة. تحتوي الخريطة على مجموعة من المفاتيح، وكل مفتاح منها مرتبط بقيمة معينة. ويستطيع المستخدم استرجاع قيمة مخزّنة بتمرير المفتاح المناسب. كما يمكنه إدراج المفاتيح والقيم المرتبطة بها وحذفها.
HashMap مجموعة عامة (مثل معظم المجموعات في المكتبة القياسية)، ولذلك فهي تدعم تشكيلة واسعة من الأنواع كمفاتيح، بما في ذلك البنى التي يعرّفها المستخدم والصفوف. ويمكن أن تكون قيمها من أي نوع.
HashMap
يُنشأ HashMap باستخدام الدالة HashMap::new(). تُنشئ مقتطفة الكود التالية HashMap تربط أسماء الفرق بنقاطها.
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
HashMap
إذا عُلم بوجود قيمة ما داخل HashMap، فمن المناسب استخدام عامل الفهرسة ([]). لاسترجاع نقاط الفريق الأزرق مثلًا، يمكننا استخدام scores["Blue"]. ومع ذلك، إذا لم يكن زوج المفتاح والقيمة المناسب موجودًا في HashMap، فستؤدي هذه العملية إلى panic.
إلى جانب عامل الفهرسة، هناك أسلوبان آخران للوصول إلى القيم المخزّنة في HashMap. الأول استخدام الدالة العضو get:
if let Some(blue_score) = scores.get("Blue") {
println!("Blue scored: {blue_score} \n");
}
تصل get إلى القيمة المخزّنة مقابل المفتاح المطلوب. وهي تُرجع None إذا لم يكن المفتاح المُمرَّر موجودًا في HashMap، وتُرجع Some(value) إذا كان المفتاح موجودًا. لمعرفة المزيد حول Options في Rust، راجع مفهوم Options.
الأسلوب الآخر للوصول إلى القيم المخزّنة في HashMap هو استخدام الطريقة entry. تُرجع الطريقة entry (أو entry API) مرجعًا إلى مدخل زوج المفتاح والقيمة في HashMap. ويمثّل المدخل حالة هذا المفتاح في الـ Hash. وإذا لم يكن المفتاح موجودًا، فلا توجد قيمة في المدخل (وهو ما يسمح بإدراج قيمة).
let mut vote_counter: HashMap<_, usize> = HashMap::new();
let votes = ["Blue", "Red", "Red", "Blue", "Red", "Blue", "Blue"];
for vote in votes {
let count = vote_counter.entry(vote).or_default();
*count += 1;
}
println!("{vote_counter:#?}");
تجعل واجهة API هذه بعض أنماط الوصول الشائعة مريحة جدًا، وقد خُصّص لها مفهوم كامل (Entry API).
تتميز HashMap بسرعة نسبية، ولديها تعقيد زمني ثابت مطفَأ (O(1)) لكل العمليات التي تتضمن مفتاحًا واحدًا.
HashMap بنية بيانات عامة، أي أنها تدعم استخدام أنواع اعتباطية كمفاتيح وقيم، مع قيد واحد فقط: لكي يُستخدم نوع ما كنوع للمفتاح، يجب أن يوفّر تنفيذًا لسمتين: Eq وHash. ولا توجد أي حدود سمات على نوع القيمة.