#hash-map #collision #hash #map

implhm

处理碰撞的 HashMap 的简化库

1 个稳定版本

1.0.8 2022年5月19日
1.0.7 2022年5月6日
0.1.0 2022年5月1日

1888数据结构

每月下载量 23

MIT 许可证

44KB
1K SLoC

implhm

处理碰撞的 HashMap 的简化库

入门指南

implhm 放入你的 Cargo.toml

[dependencies]
implhm = "1.0.8"

功能

处理碰撞有多种不同的方法。 implhm 提供了最基本实现。以下功能可用:

  • 分离链表 (默认)
  • 开放寻址
    • 双重散列
    • 线性探测
    • 二次探测
  • 分离链表测试
  • 开放寻址测试
    • 双重散列测试
    • 线性探测测试
    • 二次探测测试

以下是一个使用单个功能的示例

[dependencies]
implhm = { version = "1.0.8", default-features = false, features = ["quadratic-probing"] }

用法

使用两个字符串的基本散列碰撞示例

use std::{
    collections::hash_map::DefaultHasher,
    hash::{Hash, Hasher},
};

fn hash<T: Hash>(key: T) -> u64 {
    let mut state = DefaultHasher::new();
    key.hash(&mut state);
    state.finish() % 17
}

fn main() {
    /*
        When passed through the `hash` function,
        `orange` and `blueberry` both equal `8`
    */
    let a = hash("orange");
    let b = hash("blueberry");
    /*
        If *collision* isn't handled, then the *value*
        ("orange") at the location of the *key* (`8`)
        would be replaced with the *value* ("blueberry")
    */
    assert_eq!(a, b)
}

在这里,碰撞完全由 分离链表 处理

use implhm::{Map, MapMut, SCHashMap};

fn main() {
    let mut map = SCHashMap::default();

    map.insert("orange", "ORANGE");
    map.insert("blueberry", "BLUEBERRY");
    /*
        In the case of *separate chaining*, collision is
        handled by placing any key-pairs that calculate to
        the same hash into an ordered list at that index.
    */
    assert_eq!(map.get("orange"), Some(&"ORANGE"));
    assert_eq!(map.get("blueberry"), Some(&"BLUEBERRY"));
}

无运行时依赖

功能