HashMap

Một bảng băm chuẩn với cơ chế bảo vệ chống lại các cuộc tấn công HashDoS:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 10 minutes.
  • HashMap không được định nghĩa trong prelude và cần phải được import vào scope trước khi sử dụng.

  • Thử chạy đoạn code sau. Dòng đầu tiên sẽ kiểm tra xem một cuốn sách có tồn tại trong hashmap không, và nếu không trả về một giá trị thay thế. Dòng thứ hai sẽ chèn giá trị thay thế vào hashmap nếu cuốn sách không tồn tại.

    let pc1 = page_counts .get("Harry Potter và hòn đá phù thủy") .unwrap_or(&336); let pc2 = page_counts .entry("Trò chơi sinh tử".to_string()) .or_insert(374);
  • Khác với vec!, Rust không cung cấp macro hashmap!.

    • Thay vào đó, kể từ phiên bản Rust 1.56, HashMap implement From<[(K, V); N]>, cho phép chúng ta dễ dàng khởi tạo một hashmap từ một mảng giá trị:

      let page_counts = HashMap::from([ ("Harry Potter và hòn đá phù thủy".to_string(), 336), ("Trò chơi sinh tử".to_string(), 374), ]);
  • HashMap cũng có thể được khởi tạo từ bất kỳ Iterator nào trả về các cặp key-value.

  • Trong những ví dụ trên, HashMap<String, i32> được sử dụng thay vì &str để làm cho ví dụ dễ hiểu hơn. Ta tất nhiên có thể sử dụng tham chiếu trong các cấu trúc dữ liệu, nhưng có thể gặp nhiều vấn đề với hệ thống kiểm tra vay mượn của Rust.

    • Thử xoá hàm to_string() từ ví dụ trên và xem chương trình có vẫn chạy không. Bạn nghĩ chúng ta sẽ gặp vấn đề ở đâu?
  • HashMap đi kèm với nhiều kiểu dữ liệu chỉ sử dụng làm kiểu trả về của một số hàm, như std::collections::hash_map::Keys. Những kiểu dữ liệu này thường xuất hiện trong tài liệu của Rust. Hãy cho học viên xem tài liệu về kiểu dữ liệu Keys, và liên hệ với hàm keys.