3.15.3 HashMap(哈希映射)

Rust 中的 HashMap(哈希映射)是一个基于键值对的无序集合,它提供了高效的查找、插入和删除操作。HashMap 使用哈希函数将键映射到相应的存储桶,这使得大部分操作具有 O(1) 的平均时间复杂度。以下是有关 Rust HashMap 的一些详细信息:

1. 创建 HashMap:

要创建一个新的空 HashMap,可以使用 HashMap::new() 方法。需要导入 std::collections::HashMap 模块以使用 HashMap。

#![allow(unused)]
fn main() {
use std::collections::HashMap;

let mut map = HashMap::new();
}

2. 插入键值对:

可以使用 insert() 方法向 HashMap 中添加键值对。如果使用相同的键插入新值,旧值将被替换。

#![allow(unused)]
fn main() {
map.insert("one", 1);
map.insert("two", 2);
}

3. 访问值:

可以使用 get() 方法根据键查找值。此方法返回一个 Option<&V> 类型,如果找到键,则返回 Some(&value),否则返回 None

#![allow(unused)]
fn main() {
let value = map.get("one"); // 返回 Option<&V>
}

还可以使用 get_mut() 方法获取可变引用。

4. 遍历键值对:

可以使用 for 循环遍历 HashMap 中的所有键值对。

#![allow(unused)]
fn main() {
for (key, value) in &map {
    println!("{}: {}", key, value);
}
}

5. 删除键值对:

可以使用 remove() 方法根据键删除键值对。此方法返回一个 Option<V> 类型,如果找到并删除了键值对,则返回 Some(value),否则返回 None

#![allow(unused)]
fn main() {
map.remove("one"); // 删除键为 "one" 的键值对
}

6. 检查键是否存在:

可以使用 contains_key() 方法检查 HashMap 中是否存在指定的键。

#![allow(unused)]
fn main() {
let has_key = map.contains_key("one"); // 返回布尔值
}

7. 更新值:

可以使用 entry() 方法与 or_insert() 方法结合,更新 HashMap 中的值或插入新值。

#![allow(unused)]
fn main() {
*map.entry("three").or_insert(3) += 1;
}

8. HashMap 的容量和长度:

可以使用 len() 方法获取 HashMap 中的键值对数量,使用 capacity() 方法获取容量。还可以使用 shrink_to_fit() 方法减小容量以匹配当前长度。

9. 默认哈希器:

Rust 的 HashMap 默认使用一个加密安全的哈希函数(SipHash),它在防止哈希碰撞攻击方面表现良好,但可能不如其他哈希函数快。可以通过为 HashMap 类型提供自定义的哈希器来改变默认行为。

#![allow(unused)]
fn main() {
use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use twox_hash::XxHash64;

type FastHashMap<K, V> = HashMap<K, V, BuildHasherDefault<XxHash64>>;

let mut map: FastHashMap<&str, i32> = FastHashMap::default();
map.insert("one",  1);
map.insert("two", 2);
}

在这个例子中,我们使用了 twox_hash 库中的 XxHash64 哈希函数,它通常比默认的 SipHash 更快。请注意,使用自定义哈希函数可能会降低安全性,因此要确保在明确了解潜在风险的情况下进行更改。

10. 合并两个 HashMap:

可以使用 extend() 方法将另一个 HashMap 的键值对添加到当前 HashMap 中。如果存在重复的键,目标 HashMap 中的值将被源 HashMap 中的值覆盖。

#![allow(unused)]
fn main() {
let mut map1 = HashMap::new();
map1.insert("one", 1);
map1.insert("two", 2);

let mut map2 = HashMap::new();
map2.insert("two", 22);
map2.insert("three", 3);

map1.extend(map2); // 将 map2 中的键值对添加到 map1
}

这样,map1 将包含键值对 "one" -> 1, "two" -> 22"three" -> 3

总之,Rust 中的 HashMap 是一个功能丰富且性能优越的键值对集合,非常适合在需要快速查找和修改操作的场景中使用。