use std::collections::LinkedList;
struct Entry {
key: String,
value: i32,
}
struct HashMap {
buckets: Vec<LinkedList<Entry>>,
size: usize,
}
impl HashMap {
fn new(size: usize) -> Self {
let mut buckets = Vec::with_capacity(size);
for _ in 0..size {
buckets.push(LinkedList::new());
}
HashMap { buckets, size }
}
fn hash(&self, key: &str) -> usize {
let mut hash = 0;
for b in key.bytes() {
hash = (hash * 31 + b as usize) % self.size;
}
hash
}
fn insert(&mut self, key: String, value: i32) {
let index = self.hash(&key); // compute bucket index
for entry in self.buckets[index].iter_mut() {
if entry.key == key {
entry.value = value; // update if key exists
return;
}
}
self.buckets[index].push_back(Entry { key, value }); // add new entry
}
fn get(&self, key: &str) -> Option<i32> {
let index = self.hash(key); // compute bucket index
for entry in self.buckets[index].iter() {
if entry.key == key {
return Some(entry.value); // found key
}
}
None // key not found
}
fn print(&self) {
for (i, bucket) in self.buckets.iter().enumerate() {
print!("[{}] -> ", i);
for entry in bucket {
print!("({},{}) -> ", entry.key, entry.value);
}
println!("null");
}
}
}
fn main() {
let mut map = HashMap::new(5);
map.insert("apple".to_string(), 5);
map.insert("banana".to_string(), 3);
map.insert("grape".to_string(), 7);
map.print();
if let Some(val) = map.get("grape") {
println!("Value for \"grape\" is {}", val);
} else {
println!("Key not found");
}
}let index = self.hash(&key); // compute bucket index
compute bucket index using hash function
for entry in self.buckets[index].iter_mut() { if entry.key == key { entry.value = value; return; } }
check if key exists in bucket to update value
self.buckets[index].push_back(Entry { key, value }); // add new entry
insert new key-value pair at bucket end
for entry in self.buckets[index].iter() { if entry.key == key { return Some(entry.value); } }
search bucket chain for key to get value
[0] -> null
[1] -> null
[2] -> (apple,5) -> (grape,7) -> null
[3] -> null
[4] -> (banana,3) -> null
Value for "grape" is 7