#hash-map #frozen #hashbrown #standard #blob #memory #dump

frozen-hashbrown

Frozen version of Rust standard library's hashbrown

1 个不稳定版本

0.1.0 2023年10月30日

#5 in #frozen

每月下载 27
2 个crate中使用(通过 firedbg-rust-debugger

MIT/Apache

16KB
297 代码行(不含注释)

frozen-hashbrown

Frozen version of Rust standard library's hashbrown.

这是关于什么的

  1. 允许您将 std::collections::HashMap 的内存转储到blob中
  2. 加载blob并重新构建hashmap
  3. 这样我们就可以遍历数据了!

这是为了什么

  1. 在FireDBG中使用,以便我们可以捕获和渲染 HashMap
  2. 它也可能允许我们从 coredump 中提取 HashMap

它是如何工作的

在线

  1. (K, V) 构建表格布局
  2. 提取 ctrlbucket_mask
  3. calculate_layout_for(buckets) 并计算地址 NonNull<u8>Layout
  4. 将内存转储到blob中

离线

  1. 将blob加载到内存中
  2. 重新构建 hashbrown::map::HashMap for (K, V)
  3. 准备就绪

为什么它有效

  1. Rust标准库中的HashMap是一个扁平HashMap。这意味着它只由一块连续的内存支持。
  2. 对于小映射来说,它很密集,并且非常节省内存
  3. 它更像是一个带有辅助索引以辅助哈希键查找的 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