为 Rust 编译时生成静态映射
Rust-PHF is a library to generate efficient lookup tables at compile time using perfect hash functions.
It currently uses the
CHD algorithm by default and
also ships an experimental ptrhash feature for an alternative MPHF layout.
MSRV (minimum supported rust version) is Rust 1.85.
PHF data structures can be constructed via either the procedural
macros in the phf_macros crate or code generation supported by the
phf_codegen crate.
To compile the phf crate with a dependency on
libcore instead of libstd, enabling use in environments where libstd
will not work, set default-features = false for the dependency:
[dependencies]
# to use `phf` in `no_std` environments
phf = { version = "0.14.0", default-features = false }
…
[dependencies]
phf = { version = "0.14.0", features = ["macros"] }
To try the experimental alternative, enable ptrhash on both the generator and
runtime crates you use:
[dependencies]
phf = { version = "0.14.0", features = ["macros", "ptrhash"] }
Currently, the macro syntax has some limitations and may not
work as you want. See #196 for example.
Integer literals in the first key's type shape must use explicit suffixes, such
as 0u32, [0u8, 1], or (0u32, 1u32); later keys infer unsuffixed integer
literals from the same position in that first key.
Tuple keys are supported up to 12 elements.
All keys must use the same supported key expression type as the first key.
To use phf_codegen on build.rs, you have to add dependencies under [build-dependencies]:
[build-dependencies]
phf = { version = "0.14.0", default-features = false }
phf_codegen = "0.14.0"
When using the experimental ptrhash layout, enable the ptrhash feature on
both phf_codegen and the runtime phf dependency so the generated constants
match the runtime struct layout.
Then put code on build.rs:
…
and 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()
}
pub fn parse_operator(operator: &str) -> Option<&'static str> {
OPERATORS.get(operator).copied()
}
暂无开放 Issues,或尚未同步最近议题。