2 个版本
0.1.1 | 2023 年 11 月 22 日 |
---|---|
0.1.0 | 2023 年 10 月 16 日 |
#1930 in 数据结构
60KB
973 行
QuickPHF-Codegen
quickphf_codegen
是一个 Rust 包,它允许您使用 PTHash 完美哈希函数在编译时生成静态哈希映射和哈希集。
要查看使用这些数据结构的运行时代码,请查看 quickphf
包。
支持的最小 Rust 版本是 1.56。此包使用 #![forbid)]
。
警告:quickphf
和 quickphf_codegen
当前使用标准库的 Hash
特性,该特性在不同的端序系统之间不可移植。
示例
目前,生成用于与 quickphf
一起使用的数据结构的唯一方法是运行 build_raw_map
、build_map
或 build_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 与自定义类型
要作为PhfMap
或PhfSet
的键,或在RawPhfMap
或PhfMap
中作为值,类型必须实现ConstInstantiable
特质,该特质提供了一种在const
上下文中实例化该类型任何值的方法。这个特质已经为许多内置类型实现了,但用户也可以通过两种方式之一为自己的自定义类型实现它:
- 如果实例化类型值所需的代码与其
Debug
表示形式相同,例如,如下枚举
#[derive(Debug, Hash, PartialEq, Eq)]
enum PositionType {
Contract { hours_per_week: u32 },
Salaried,
Managerial,
}
那么只需写出
impl quickphf_codegen::DebugInstantiable for PositionType {}
- 用户必须提供一个自定义实现。例如,以下结构体具有私有字段,因此其值不能使用
{}
语法实例化,但它提供了一个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 License, Version 2.0, (LICENSE-APACHE或https://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT或https://opensource.org/licenses/MIT)
- zlib许可证 (LICENSE-ZLIB或https://opensource.org/license/zlib/)
由您选择。
贡献
除非您明确说明,否则您提交给作品包含在内的任何贡献,根据Apache-2.0许可证定义,将按照上述方式多许可证使用,没有任何额外的条款或条件。
依赖关系
~97KB