在现代编程中,哈希表(Hash Table)是一种非常重要的数据结构,它提供了平均 O(1) 的查找、插入和删除性能。而 Rust 作为一门系统级语言,其内存安全性和高性能特性使其成为实现高效数据结构的理想选择。
本教程将带你从零开始,用 Rust 实现一个链式哈希表(Chained Hash Table),即使你是 Rust 新手,也能轻松理解并动手实践!我们将覆盖以下内容:
链式哈希表通过“桶”(bucket)数组存储数据。每个桶是一个链表(或其他容器),用于处理哈希冲突——即多个键映射到同一个索引的情况。当发生冲突时,新元素被添加到对应桶的链表中。

在开始编码前,你需要了解以下 Rust 概念:
std::collections::LinkedList 或 Vec:用于实现每个桶中的链表。std::hash::Hash 和 Eq trait:用于对键进行哈希和比较。我们首先定义 HashTable 结构体。它包含一个桶数组,每个桶是一个 Vec(代表链表):
use std::hash::{Hash, Hasher};use std::collections::hash_map::DefaultHasher;#[derive(Debug)]struct Entry<K, V> { key: K, value: V,}pub struct HashTable<K, V> { buckets: Vec<Vec<Entry<K, V>>>, size: usize,}我们需要一个方法来创建新的哈希表,并指定初始桶数量(容量):
impl<K, V> HashTable<K, V> { pub fn new(capacity: usize) -> Self { let mut buckets = Vec::with_capacity(capacity); for _ in 0..capacity { buckets.push(Vec::new()); } HashTable { buckets, size: 0, } }}为了将键映射到桶索引,我们需要一个哈希函数。这里使用 Rust 标准库的 DefaultHasher:
fn hash<K: Hash>(key: &K, capacity: usize) -> usize { let mut hasher = DefaultHasher::new(); key.hash(&mut hasher); (hasher.finish() as usize) % capacity}插入时,先计算键的哈希值,找到对应桶,然后检查是否已存在该键。如果存在则更新值,否则添加新条目:
impl<K: Eq + Hash, V> HashTable<K, V> { pub fn insert(&mut self, key: K, value: V) { let index = hash(&key, self.buckets.len()); let bucket = &mut self.buckets[index]; // 检查是否已存在该键 for entry in bucket.iter_mut() { if entry.key == key { entry.value = value; return; } } // 不存在则插入新条目 bucket.push(Entry { key, value }); self.size += 1; }}查找操作同样先定位桶,然后遍历链表寻找匹配的键:
impl<K: Eq + Hash, V> HashTable<K, V> { pub fn get(&self, key: &K) -> Option<&V> { let index = hash(key, self.buckets.len()); let bucket = &self.buckets[index]; for entry in bucket { if &entry.key == key { return Some(&entry.value); } } None }}现在,我们可以写一个简单的测试来验证我们的 Rust链式哈希表 是否正常工作:
fn main() { let mut table = HashTable::new(10); table.insert("apple", 5); table.insert("banana", 3); table.insert("apple", 10); // 更新值 println!("apple: {:?}", table.get(&"apple")); // Some(10) println!("orange: {:?}", table.get(&"orange")); // None}IntoIterator 以支持 for 循环遍历。通过本教程,你已经掌握了如何在 Rust 中实现一个基本的链式哈希表。这不仅加深了你对 Rust数据结构 的理解,也让你体会到 Rust 在内存安全与性能之间的精妙平衡。
记住,真正的学习在于动手实践。尝试为你的哈希表添加删除方法、实现自动扩容,或者用它解决实际问题!
希望这篇 Rust哈希表实现 教程对你有帮助。如果你喜欢,请分享给其他正在学习 链式哈希表教程 的朋友!
本文由主机测评网于2025-12-28发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251213435.html