#map #lookup #key-string #byte-sequences #read-memory #data-structures #operating-system

sequence-map

实现了将无符号64位键映射到字符串的映射。该映射优化了单次创建后多次读取的性能。使用结构体 Builder 来构建映射,使用结构体 Map 进行查找。该实现的特殊之处在于,它将所有用于查找的数据编码在一个字节序列中。这使得它在动态加载数据并将其放置在操作系统的只读内存中时非常有趣。内部结构在加载时无需解码(例如,从文件中加载)。

1 个不稳定版本

0.1.0 2020年5月17日

#14#read-memory

Apache-2.0

35KB
638

此crate实现了将无符号64位键映射到字符串的映射。

该映射优化了单次创建后多次读取的性能。使用结构体 Builder 来构建映射,使用结构体 Map 进行查找。

该实现的特殊之处在于,它将所有用于查找的数据编码在一个字节序列中。这使得它在动态加载数据并将其放置在操作系统的只读内存中时非常有趣。内部结构在加载时无需解码(例如,从文件中加载)。

映射在内部表示为一个字典树,每个字典树的级别都由键的若干位索引,从最低有效位开始。例如,当使用2位创建构建器时,则每级字典树都会从提供的键中切掉2位。

示例

use sequence_map::{Builder, Map};

const BITS: usize = 2;

let mut builder = Builder::new(BITS);

builder.insert(42, "Hello!");

// Note: a second insert under the same key does *not* replace the
// previously inserted key.
builder.insert(42, "Wonderful!");
builder.insert(84, "World!");

// This is the resulting byte sequence.
let bytes: Vec<u8> = builder.build();

// Now, look up some keys.
let lookup = Map::new(&bytes);
assert_eq!("Hello!", lookup.get(42).unwrap());
assert_eq!("World!", lookup.get(84).unwrap());
assert!(lookup.get(100).is_none());

这不是一个官方支持的产品。

依赖项

~2.5MB
~48K SLoC