#map #hash-map #static #hash

static_map_macros

用于 static_map 的过程宏

3 个不稳定版本

使用旧的 Rust 2015

0.2.0-beta2017年7月29日
0.1.1 2017年7月17日
0.1.0 2017年7月16日

#69 in #hashmap

Apache-2.0/MIT

220KB
170

静态映射

这是一个静态循环冗余哈希表实现,使用了 rustc 中找到的相同的哈希器。这目前使用的是过程宏的感叹号变体,目前只在 nightly 版本中可用。过程宏目前处于积极开发中,因此我目前不会期望这里有任何稳定性。这只是作为一个练习,以获取关于过程宏开发可能如何进行的经验。

示例

#[macro_use]
extern crate static_map;
#[macro_use]
extern crate static_map_macros;

use static_map::Map;

#[derive(Clone, Copy)]
struct RGB(u8, u8, u8);

static CSS_COLORS: Map<&'static str, RGB> = static_map! {
    Default: RGB(0x00,0x00,0x00),
    "black" => RGB(0x00,0x00,0x00),
    "silver" => RGB(0xc0,0xc0,0xc0),
    "gray" => RGB(0x80,0x80,0x80),
    "white" => RGB(0xff,0xff,0xff),
    "maroon" => RGB(0x80,0x00,0x00),
    "red" => RGB(0xff,0x00,0x00),
    "purple" => RGB(0x80,0x00,0x80),
    "fuchsia" => RGB(0xff,0x00,0xff),
    "green" => RGB(0x00,0x80,0x00),
};

pub fn rgb_from_str(color: &str) -> Option<RGB> {
    CSS_COLORS.get(color).cloned()
}

请注意,Default: RGB(0, 0, 0),。这是必需的,因为我们正在初始化一个将包含空槽位的数组。我们需要这些槽位的默认值,您可以这样声明它。PHF 映射不需要这个,因为它们是完美的。此外,请注意,#[macro_use] 对于 static_mapstatic_map_macros 都需要。这是因为 proc_macros 不允许导出项,所以 static_map! 宏位于 static_map 包中。(注意:这并不完全正确,并且可能很快得到修复)。

基准测试

想法是静态循环冗余哈希表可能比 PHF 对某些数据集更有效。权衡是 PHF 哈希表实现就内存效率而言几乎是最佳的;在最坏情况下,static_map! 可能会使用多达 2 倍的内存。请记住这一点,这里有一些基准测试(位于 static_map_macro/benches 中)。

CSS 颜色

这包含大约 150 个 &str -> RGB(u8, u8, u8) 条目(如上例所示)。

test bench_phf        ... bench:       2,027 ns/iter (+/- 224)
test bench_static_map ... bench:         935 ns/iter (+/- 90)

代码点

此基准包含约4500个 u32 -> GlyphMetrics 条目。

test bench_phf        ... bench:      44,502 ns/iter (+/- 3,971)
test bench_static_map ... bench:      13,097 ns/iter (+/- 2,768)

TeX 符号

此基准包含约1500个 &str -> Symbol 条目,将 TeX 符号映射到码点。

test bench_phf        ... bench:      20,382 ns/iter (+/- 133)
test bench_static_map ... bench:      24,589 ns/iter (+/- 188)

依赖项

约2MB
约43K SLoC