#完美哈希 #哈希 #哈希表 #代码生成 #mphf #生成静态

bin+lib quickphf_codegen

用于与 quickphf 一起使用创建静态映射和集合的代码生成器

2 个版本

0.1.1 2023 年 11 月 22 日
0.1.0 2023 年 10 月 16 日

#1930 in 数据结构

Zlib OR Apache-2.0 OR MIT

60KB
973

QuickPHF-Codegen

Latest Release Documentation Minimum Supported Rust Version 1.56

quickphf_codegen 是一个 Rust 包,它允许您使用 PTHash 完美哈希函数在编译时生成静态哈希映射和哈希集。

要查看使用这些数据结构的运行时代码,请查看 quickphf

支持的最小 Rust 版本是 1.56。此包使用 #![forbid)]

警告quickphfquickphf_codegen 当前使用标准库的 Hash 特性,该特性在不同的端序系统之间不可移植。

示例

目前,生成用于与 quickphf 一起使用的数据结构的唯一方法是运行 build_raw_mapbuild_mapbuild_set 之一,将结果作为字符串显示,然后将在所需位置导入生成的 Rust 代码。

例如,您可以编写一个 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(fs::File::create(&path).unwrap());

    let keys = ["jpg", "png", "svg"];
    let values = ["image/jpeg", "image/png", "image/svg+xml"];
    let code = quickphf_codegen::build_map(&keys, &values);

    write!(&mut file, code).unwrap();
}

然后通过以下方式在您的 lib.rs 中导入结果

static MIME_TYPES: quickphf::PhfMap<&'static str, &'static str> =
    include!(concat!(env!("OUT_DIR"), "/codegen.rs"));

高级用法

使用 QuickPHF 与自定义类型

要作为PhfMapPhfSet的键,或在RawPhfMapPhfMap中作为值,类型必须实现ConstInstantiable特质,该特质提供了一种在const上下文中实例化该类型任何值的方法。这个特质已经为许多内置类型实现了,但用户也可以通过两种方式之一为自己的自定义类型实现它:

  1. 如果实例化类型值所需的代码与其Debug表示形式相同,例如,如下枚举
#[derive(Debug, Hash, PartialEq, Eq)]
enum PositionType {
    Contract { hours_per_week: u32 },
    Salaried,
    Managerial,
}

那么只需写出

impl quickphf_codegen::DebugInstantiable for PositionType {}
  1. 用户必须提供一个自定义实现。例如,以下结构体具有私有字段,因此其值不能使用{}语法实例化,但它提供了一个new构造函数,该构造函数是const fn。因此,给定
#[derive(Debug, Hash, PartialEq, Eq)]
struct EmploymentRules {
    overtime_eligible: bool,
    bonus_eligible: bool,
}

impl EmploymentRules {
    pub const fn new(overtime_eligible: bool, bonus_eligible: bool) -> EmploymentRules {
        EmploymentRules {
            overtime_eligible,
            bonus_eligible,
        }
    }
}

我们可以通过以下方式提供一个自定义的ConstInstantiable实现:

use core::fmt;
use quickphf_codegen::*;

impl ConstInstantiable for EmploymentRules {
    fn fmt_const_new(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "EmploymentRules::new({}, {})",
            self.overtime_eligible, self.bonus_eligible
        )
    }
}

性能

使用quickphf_codegen生成基于PHF的数据结构比使用phf快约10倍。它可以在约300毫秒内生成1,000,000条条目的映射。

许可证

以下任何一种许可证下使用

由您选择。

贡献

除非您明确说明,否则您提交给作品包含在内的任何贡献,根据Apache-2.0许可证定义,将按照上述方式多许可证使用,没有任何额外的条款或条件。

依赖关系

~97KB