#完美哈希 #结构 #数据 #编译时 #已弃用 #映射

已弃用 phf_builder

已弃用:自0.8.0版本移除。运行时创建完美哈希函数数据结构

12个版本

使用旧的Rust 2015

0.7.25 2019年7月27日
0.7.24 2019年1月5日
0.7.23 2018年8月27日
0.7.22 2018年4月28日
0.7.14 2016年3月30日

#17 in #完美哈希

MIT 许可证

55KB
971

Rust-PHF

CI Latest Version

文档

Rust-PHF是一个库,使用完美哈希函数在编译时生成高效的查找表。

它目前使用CHD算法,可以在大约0.4秒内生成10万个条目的映射。

MSRV(最低支持的Rust版本)是Rust 1.61。

使用方法

PHF数据结构可以通过phf_macroscrate中的过程宏或由phf_codegencrate支持的代码生成来构建。

要使用不依赖于libstd而是libcore的libcore编译phfcrate,请将依赖项的default-features = false设置为false

[dependencies]
# to use `phf` in `no_std` environments
phf = { version = "0.11", default-features = false }

phf_macros

use phf::phf_map;

#[derive(Clone)]
pub enum Keyword {
    Loop,
    Continue,
    Break,
    Fn,
    Extern,
}

static KEYWORDS: phf::Map<&'static str, Keyword> = phf_map! {
    "loop" => Keyword::Loop,
    "continue" => Keyword::Continue,
    "break" => Keyword::Break,
    "fn" => Keyword::Fn,
    "extern" => Keyword::Extern,
};

pub fn parse_keyword(keyword: &str) -> Option<Keyword> {
    KEYWORDS.get(keyword).cloned()
}
[dependencies]
phf = { version = "0.11", features = ["macros"] }

注意

目前,宏语法有一些限制,可能无法按预期工作。例如,请参阅#183#196

phf_codegen

要在build.rs中使用phf_codegen,您必须将依赖项添加到[build-dependencies]

[build-dependencies]
phf = { version = "0.11.1", default-features = false }
phf_codegen = "0.11.1"

然后在build.rs中放置代码

use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;

fn main() {
    let path = Path::new(&env::var("OUT_DIR").unwrap()).join("codegen.rs");
    let mut file = BufWriter::new(File::create(&path).unwrap());

    write!(
        &mut file,
        "static KEYWORDS: phf::Map<&'static str, Keyword> = {}",
        phf_codegen::Map::new()
            .entry("loop", "Keyword::Loop")
            .entry("continue", "Keyword::Continue")
            .entry("break", "Keyword::Break")
            .entry("fn", "Keyword::Fn")
            .entry("extern", "Keyword::Extern")
            .build()
    )
    .unwrap();
    write!(&mut file, ";\n").unwrap();
}

以及lib.rs

#[derive(Clone)]
enum Keyword {
    Loop,
    Continue,
    Break,
    Fn,
    Extern,
}

include!(concat!(env!("OUT_DIR"), "/codegen.rs"));

pub fn parse_keyword(keyword: &str) -> Option<Keyword> {
    KEYWORDS.get(keyword).cloned()
}

依赖项

~0.6–0.8MB
~12K SLoC