A hash map stores values by key so repeated lookups do not need a linear scan.

Program

Play the program to choose a user id and see the cached credit value returned.

user_id
hash_map_lookup.rs
Replay: real traced execution (multi-file project)
use std::collections::HashMap;

fn main() {
    let user_id = 2;
    let mut credits = HashMap::new();
    credits.insert(1, 10);
    credits.insert(2, 25);
    let total = lookup_credit(&credits, user_id);
    println!("user {user_id}: {total}");
}

fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
    credits.get(&user_id).copied().unwrap_or(0)
}
use std::collections::HashMap;

fn main() {
    let user_id = 1;
    let mut credits = HashMap::new();
    credits.insert(1, 10);
    credits.insert(2, 25);
    let total = lookup_credit(&credits, user_id);
    println!("user {user_id}: {total}");
}

fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
    credits.get(&user_id).copied().unwrap_or(0)
}
use std::collections::HashMap;

fn main() {
    let user_id = 3;
    let mut credits = HashMap::new();
    credits.insert(1, 10);
    credits.insert(2, 25);
    let total = lookup_credit(&credits, user_id);
    println!("user {user_id}: {total}");
}

fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {
    credits.get(&user_id).copied().unwrap_or(0)
}
  1. user_id ← 2, credits ← {}

    3fn main() {4    let user_i→ 2d = 2; //@user_id=2, 1, 35    let mut credit→ {}s = HashMap::new();6    credits.insert(1, 10);7    credits.insert(2, 25);8    let total = lookup_credit(&credit{1: 10, 2: 25}s, user_i2d);9    println!("user {user_id}: {total}");
  2. fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32

    12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13    credits.get(&user_i2d).copied().unwrap_or(0)14}
  3. total ← 25

    7    credits.insert(2, 25);8    let tota→ 25l = lookup_credit(&credit{1: 10, 2: 25}s, user_i2d);9    println!("user {user_id}: {total}");10}
    outputuser 2: 25
  1. user_id ← 1, credits ← {}

    3fn main() {4    let user_i→ 1d = 1;5    let mut credit→ {}s = HashMap::new();6    credits.insert(1, 10);7    credits.insert(2, 25);8    let total = lookup_credit(&credit{2: 25, 1: 10}s, user_i1d);9    println!("user {user_id}: {total}");
  2. fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32

    12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13    credits.get(&user_i1d).copied().unwrap_or(0)14}
  3. total ← 10

    7    credits.insert(2, 25);8    let tota→ 10l = lookup_credit(&credit{2: 25, 1: 10}s, user_i1d);9    println!("user {user_id}: {total}");10}
    outputuser 1: 10
  1. user_id ← 3, credits ← {}

    3fn main() {4    let user_i→ 3d = 3;5    let mut credit→ {}s = HashMap::new();6    credits.insert(1, 10);7    credits.insert(2, 25);8    let total = lookup_credit(&credit{2: 25, 1: 10}s, user_i3d);9    println!("user {user_id}: {total}");
  2. fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32

    12fn lookup_credit(credits: &HashMap<i32, i32>, user_id: i32) -> i32 {13    credits.get(&user_i3d).copied().unwrap_or(0)14}
  3. total ← 0

    7    credits.insert(2, 25);8    let tota→ 0l = lookup_credit(&credit{2: 25, 1: 10}s, user_i3d);9    println!("user {user_id}: {total}");10}
    outputuser 3: 0
hash map `HashMap` stores values under keys for direct lookup.
copied `copied()` turns an `Option<&i32>` into an `Option<i32>` for this small value type.
fallback `unwrap_or(0)` supplies a default when a key is not cached.