frozen-hashbrown
Frozen version of Rust standard library's hashbrown.
What is this about
- Allow you to dump the memory of a
std::collections::HashMapinto a blob - Load the blob and re-construct the hashmap
- Such that we can iterate through the data!
What is this for
- It's used in FireDBG to allow us to capture and render
HashMap - It could also probably allow us to extract
HashMapfromcoredump
How it works
Online
- Construct
TableLayoutfor(K, V) - Extract
ctrlandbucket_mask calculate_layout_for(buckets)and calculate the addressNonNull<u8>andLayout- Dump the memory into a blob
Offline
- Load the blob into memory
- Re-construct
hashbrown::map::HashMapfor(K, V) - Ready to serve
Why does it work
- The
HashMapin Rust's standard library is a flat hashmap. Meaning it's only backed by a single contiguous piece of memory. - It's dense for small maps and is very memory efficient
- It's more like a glorified
Vec<(K, V)>with an index to assist hash key lookup
How to use
use FrozenHashMap;
use HashMap;
let map: =
.into_iter
.collect;
let snapshot = format!;
let frozen = construct;
drop;
let frozen: = frozen.store;
let mut unfrozen = load.expect;
let unfrozen = unfrozen
.
.expect;
let unfrozen_snapshot = format!;
// even the "random" iteration order holds
assert_eq!;
More examples under https://github.com/tyt2y3/frozen-hashbrown/blob/main/tests/unfreeze.rs
License: MIT OR Apache-2.0