1 个不稳定版本
0.1.0 | 2023年9月3日 |
---|
在 缓存 中排名 #216
每月下载量 488
在 8 个Crate中使用(通过 veilid-core)
100KB
3K SLoC
hashlink — 类似HashMap的容器,可以按用户可控的顺序存储其键值对
这个Crate是基于 linked-hash-map 的分支,在 hashbrown 的基础上实现更现代版本的 LinkedHashMap
、LinkedHashSet
和 LruCache
。
一个重要的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-map
和 hashbrown
复制而来,特别是测试、关联类型如迭代器以及像 Debug
实现之类的东西。
许可证
此库的许可证与 linked-hash-map 和 hashbrown 相同,它受以下任一许可证的约束
- MIT许可证 LICENSE-MIT 或 http://opensource.org/licenses/MIT
- Apache许可证2.0 LICENSE-APACHE 或 https://opensource.org/licenses/Apache-2.0
任选其一。
依赖关系
~2MB
~27K SLoC