#key-value #lru-cache #order #pair #hash-key #user #hash-set

no-std hashlink

HashMap类似容器,可以按用户可控的顺序存储其键值对

16个版本 (8个破坏性更新)

0.9.1 2024年5月12日
0.9.0 2024年1月9日
0.8.4 2023年8月28日
0.8.3 2023年6月11日
0.3.0 2019年7月12日

#20数据结构

Download history 545744/week @ 2024-05-02 538609/week @ 2024-05-09 575223/week @ 2024-05-16 571816/week @ 2024-05-23 636498/week @ 2024-05-30 596602/week @ 2024-06-06 607245/week @ 2024-06-13 584492/week @ 2024-06-20 604338/week @ 2024-06-27 539439/week @ 2024-07-04 580111/week @ 2024-07-11 596203/week @ 2024-07-18 626506/week @ 2024-07-25 585793/week @ 2024-08-01 663999/week @ 2024-08-08 638771/week @ 2024-08-15

每月 下载量 2,635,229
2,421 个crate中 使用(直接使用 62 个)

MIT/Apache

98KB
3K SLoC

hashlink -- HashMap类似容器,可以按用户可控的顺序存储其键值对

Build Status Latest Version API Documentation

这个crate是linked-hash-map的分支,基于hashbrown实现更现代版本的LinkedHashMapLinkedHashSetLruCache

一个重要的API更改是,当使用LinkedHashMap作为LRU缓存时,它允许您轻松检索条目并将其移动到末尾,或者在不重复键哈希和查找的情况下在末尾生成新条目

let mut lru_cache = LinkedHashMap::new();
let key = "key".to_owned();
// Try to find my expensive to construct and hash key
let _cached_val = match lru_cache.raw_entry_mut().from_key(&key) {
    RawEntryMut::Occupied(mut occupied) => {
        // Cache hit, move entry to the back.
        occupied.to_back();
        occupied.into_mut()
    }
    RawEntryMut::Vacant(vacant) => {
        // Insert expensive to construct key and expensive to compute value,
        // automatically inserted at the back.
        vacant.insert(key.clone(), 42).1
    }
};

或者,一种更简单的方法来做同样的事情

let mut lru_cache = LinkedHashMap::new();
let key = "key".to_owned();
let _cached_val = lru_cache
    .raw_entry_mut()
    .from_key(&key)
    .or_insert_with(|| (key.clone(), 42));

这个crate包含相当多的不安全代码,这些代码用于处理其内部链表,并且不安全代码与原始的linked-hash-map实现有很大的差异。它目前在miri和sanitizers下通过测试,但它可能还需要更多的审查和测试,并检查测试覆盖率。

致谢

这个crate中有大量代码直接从linked-hash-maphashbrown复制,尤其是测试、关联类型如迭代器以及诸如Debug实现等。

许可

这个库与linked-hash-maphashbrown具有相同的许可,它受以下任一许可的约束

任选其一。

依赖

~1.1–1.6MB
~23K SLoC