65 releases

0.11.2 Jun 24, 2023
0.11.1 Aug 8, 2022
0.11.0 Jul 15, 2022
0.10.1 Dec 13, 2021
0.1.0 Nov 27, 2014

#6 in Data structures

Download history 1111352/week @ 2024-07-17 1171982/week @ 2024-07-24 1165405/week @ 2024-07-31 1236617/week @ 2024-08-07 1161418/week @ 2024-08-14 1246643/week @ 2024-08-21 1154688/week @ 2024-08-28 1252059/week @ 2024-09-04 1181265/week @ 2024-09-11 1167511/week @ 2024-09-18 1249618/week @ 2024-09-25 1309705/week @ 2024-10-02 1276141/week @ 2024-10-09 1350565/week @ 2024-10-16 1316443/week @ 2024-10-23 1281322/week @ 2024-10-30

5,478,829 downloads per month
Used in 5,176 crates (576 directly)

MIT license

48KB
1K SLoC

Rust-PHF

CI Latest Version

Documentation

Rust-PHF is a library to generate efficient lookup tables at compile time using perfect hash functions.

It currently uses the CHD algorithm and can generate a 100,000 entry map in roughly .4 seconds.

MSRV (minimum supported rust version) is Rust 1.60.

Usage

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.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"] }

Note

Currently, the macro syntax has some limitations and may not work as you want. See #183 or #196 for example.

phf_codegen

To use phf_codegen on build.rs, you have to add dependencies under [build-dependencies]:

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

Then put code on 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();
}

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

Dependencies

~51–280KB