#hash-table #disk #memory #mapped #structure #decoding

odht

一个Rust crate,用于哈希表,可以从磁盘映射到内存中,无需前端解码。

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 数据结构

Download history 17230/week @ 2024-03-14 16348/week @ 2024-03-21 15874/week @ 2024-03-28 14927/week @ 2024-04-04 15255/week @ 2024-04-11 16039/week @ 2024-04-18 15016/week @ 2024-04-25 15302/week @ 2024-05-02 14432/week @ 2024-05-09 13523/week @ 2024-05-16 16056/week @ 2024-05-23 14324/week @ 2024-05-30 15406/week @ 2024-06-06 15366/week @ 2024-06-13 15791/week @ 2024-06-20 12953/week @ 2024-06-27

61,924 monthly downloads
用于 2 crates

MIT/Apache

76KB
1.5K SLoC

CI Status

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));
}

依赖项