1 个不稳定版本
0.1.0 | 2023年10月30日 |
---|
#5 in #frozen
每月下载 27 次
在 2 个crate中使用(通过 firedbg-rust-debugger)
16KB
297 代码行(不含注释)
frozen-hashbrown
Frozen version of Rust standard library's hashbrown.
这是关于什么的
- 允许您将
std::collections::HashMap
的内存转储到blob中 - 加载blob并重新构建hashmap
- 这样我们就可以遍历数据了!
这是为了什么
- 在FireDBG中使用,以便我们可以捕获和渲染
HashMap
- 它也可能允许我们从
coredump
中提取HashMap
它是如何工作的
在线
- 为
(K, V)
构建表格布局 - 提取
ctrl
和bucket_mask
calculate_layout_for(buckets)
并计算地址NonNull<u8>
和Layout
- 将内存转储到blob中
离线
- 将blob加载到内存中
- 重新构建
hashbrown::map::HashMap
for(K, V)
- 准备就绪
为什么它有效
- Rust标准库中的HashMap是一个扁平HashMap。这意味着它只由一块连续的内存支持。
- 对于小映射来说,它很密集,并且非常节省内存
- 它更像是一个带有辅助索引以辅助哈希键查找的
Vec<(K, V)>
如何使用
use frozen_hashbrown::FrozenHashMap;
use std::collections::HashMap;
let map: HashMap<char, i32> = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
.into_iter()
.collect();
let snapshot = format!("{map:?}");
let frozen = FrozenHashMap::construct(&map);
std::mem::drop(map);
let frozen: Vec<u8> = frozen.store();
let mut unfrozen = FrozenHashMap::load(&frozen).expect("Failed to load");
let unfrozen = unfrozen
.reconstruct::<char, i32>()
.expect("Failed to reconstruct");
let unfrozen_snapshot = format!("{unfrozen:?}");
// even the "random" iteration order holds
assert_eq!(snapshot, unfrozen_snapshot);
更多示例在 https://github.com/tyt2y3/frozen-hashbrown/blob/main/tests/unfreeze.rs
许可:MIT OR Apache-2.0
依赖项
~4KB