#hash-map #lru-cache #no-std #data-structures #key-value #back #fork

no-std veilid-hashlink

hashlink的临时分支。类似HashMap的容器,可以按用户可控的顺序存储其键值对

1 个不稳定版本

0.1.0 2023年9月3日

缓存 中排名 #216

Download history 209/week @ 2024-03-14 174/week @ 2024-03-21 354/week @ 2024-03-28 105/week @ 2024-04-04 65/week @ 2024-04-11 137/week @ 2024-04-18 175/week @ 2024-04-25 233/week @ 2024-05-02 52/week @ 2024-05-09 121/week @ 2024-05-16 54/week @ 2024-05-23 66/week @ 2024-05-30 219/week @ 2024-06-06 107/week @ 2024-06-13 101/week @ 2024-06-20 53/week @ 2024-06-27

每月下载量 488
8 个Crate中使用(通过 veilid-core

MIT/Apache

100KB
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包含大量来自其内部链表的unsafe代码,且与原始 linked-hash-map 实现的unsafe代码有很大的差异。它目前在miri和sanitizers下通过测试,但可能仍然需要更多的审查和测试,并检查测试代码覆盖率。

致谢

该Crate中有大量代码直接从 linked-hash-maphashbrown 复制而来,特别是测试、关联类型如迭代器以及像 Debug 实现之类的东西。

许可证

此库的许可证与 linked-hash-maphashbrown 相同,它受以下任一许可证的约束

任选其一。

依赖关系

~2MB
~27K SLoC