#hash #static #time #runtime #data #maps #support

phf

Runtime support for perfect hash function data structures

57 releases

0.7.23 Aug 27, 2018
0.7.22 Apr 28, 2018
0.7.21 Jan 19, 2017
0.7.20 Nov 23, 2016
0.1.0 Nov 27, 2014

#5 in Date and time

Download history 17912/week @ 2018-08-21 24214/week @ 2018-08-28 24449/week @ 2018-09-04 25151/week @ 2018-09-11 24459/week @ 2018-09-18 23651/week @ 2018-09-25 25989/week @ 2018-10-02 26038/week @ 2018-10-09 27100/week @ 2018-10-16 25252/week @ 2018-10-23 30119/week @ 2018-10-30 29341/week @ 2018-11-06 25920/week @ 2018-11-13

90,229 downloads per month
Used in 1,009 crates (59 directly)

MIT license

26KB
640 lines

Rust-PHF

CircleCI 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 when compiling with optimizations.

Usage

PHF data structures can be constucted via either the compiler plugins in the phf_macros crate or code generation supported by the phf_codegen crate. Compiler plugins are not a stable part of Rust at the moment, so phf_macros can only be used with nightlies.

phf_macros

#![feature(plugin)]
#![plugin(phf_macros)]

extern crate phf;

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

phf_codegen

build.rs

extern crate phf_codegen;

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> = ").unwrap();
    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(&mut file)
        .unwrap();
    write!(&mut file, ";\n").unwrap();
}

lib.rs

extern crate phf;

#[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

~52KB