是否可以在编译时填充大集合?

时间:2019-03-10 02:39:54

标签: rust

我们具有“删除我的所有数据”功能。我想从许多Web日志文件中删除一组IP。

当前,在运行时,我打开一个带有要删除IP地址的CSV文件,将其变成一组,浏览文件,如果日志IP匹配,则执行删除逻辑。

有什么办法可以在编译时加载CSV并将其转换为一组?我们正在尝试将内容迁移到AWS lambda,仅部署一个静态二进制文件而没有任何依赖关系真是太好了。

3 个答案:

答案 0 :(得分:3)

Rust-PHF板条箱提供了编译时数据结构,包括(有序的)映射和集合。

不幸的是,到目前为止,它不支持一组std::net::IpAddr的初始化,但可以与静态字符串一起使用:

static IP_SET: phf::Set<&'static str> = phf_set! {
    "127.0.0.1",
    "::1",
};

答案 1 :(得分:2)

我建议仅使用Build Script来读取CSV并生成包含标准HashSet的初始化和自定义哈希值(例如,FxHash)的源文件。

这将使您可以方便地编辑CSV文件,同时仍将所有数据烘焙为二进制文件。这将需要一些初始化时间(与PHF不同),但是指定自定义哈希值的功能非常有益。

此外,根据日志中IP的格式,您可能要存储&'static stru32;后者效率更高(在搜索方式上),但是如果需要转换,则增益可以忽略。

答案 2 :(得分:2)

  

只有一个静态二进制要部署

使用include!include_str!内联整个CSV文件,然后照常处理其余程序。

use csv; // 1.0.5

static CSV_FILE: &[u8] = include_bytes!("/etc/hosts");

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut rdr = csv::ReaderBuilder::new()
        .delimiter(b'\t')
        .from_reader(CSV_FILE);

    for result in rdr.records() {
        let record = result?;
        println!("{:?}", record);
    }

    Ok(())
}

另请参阅: