5个不稳定版本
0.3.1 | 2021年10月29日 |
---|---|
0.3.0 | 2021年9月20日 |
0.2.1 | 2021年9月17日 |
0.2.0 | 2021年9月10日 |
0.1.0 | 2021年7月20日 |
#301 in 数据结构
61,924 monthly downloads
用于 2 crates
76KB
1.5K SLoC
odht
一个Rust crate,用于哈希表,可以从磁盘映射到内存中,无需前端解码。实现的目标是提供一个数据结构,
- 可以直接使用其在磁盘上存储的格式,
- 提供与Rust标准库中的HashMap大致相同的性能,
- 具有完全确定的二进制表示形式,
- 平台和字节序无关,因此在一个系统上序列化的数据可以在任何其他系统上使用,并且
- 与对齐要求无关,因此
- 其使用不受限于特定类型的CPU,并且
- 数据结构可以被映射到任意内存地址。
这个crate是由Rust编译器团队开发和维护的,用于在rustc
内部使用。这个crate将会有常规的破坏性更改,不提供稳定性保证。
lib.rs
:
这个crate实现了一个哈希表,可以以二进制、磁盘格式直接使用。目标是提供一个无需任何重大前端解码即可使用的高性能数据结构。实现不对底层数据的对齐或字节序做出假设,因此在一个平台上编码的表可以在任何其他平台上使用,并且二进制数据可以映射到任意地址的内存中。
用法
为了使用哈希表,需要实现 Config
特性。这个特性定义了表如何编码以及使用什么哈希函数。在设置了 Config
之后,可以使用 HashTableOwned
类型来构建和序列化哈希表。然后可以使用 HashTable
类型来创建对序列化哈希表的近乎零成本的视图。
use odht::{HashTable, HashTableOwned, Config, FxHashFn};
struct MyConfig;
impl Config for MyConfig {
type Key = u64;
type Value = u32;
type EncodedKey = [u8; 8];
type EncodedValue = [u8; 4];
type H = FxHashFn;
#[inline] fn encode_key(k: &Self::Key) -> Self::EncodedKey { k.to_le_bytes() }
#[inline] fn encode_value(v: &Self::Value) -> Self::EncodedValue { v.to_le_bytes() }
#[inline] fn decode_key(k: &Self::EncodedKey) -> Self::Key { u64::from_le_bytes(*k) }
#[inline] fn decode_value(v: &Self::EncodedValue) -> Self::Value { u32::from_le_bytes(*v)}
}
fn main() {
let mut builder = HashTableOwned::<MyConfig>::with_capacity(3, 95);
builder.insert(&1, &2);
builder.insert(&3, &4);
builder.insert(&5, &6);
let serialized = builder.raw_bytes().to_owned();
let table = HashTable::<MyConfig, &[u8]>::from_raw_bytes(
&serialized[..]
).unwrap();
assert_eq!(table.get(&1), Some(2));
assert_eq!(table.get(&3), Some(4));
assert_eq!(table.get(&5), Some(6));
}