我们具有“删除我的所有数据”功能。我想从许多Web日志文件中删除一组IP。
当前,在运行时,我打开一个带有要删除IP地址的CSV文件,将其变成一组,浏览文件,如果日志IP匹配,则执行删除逻辑。
有什么办法可以在编译时加载CSV并将其转换为一组?我们正在尝试将内容迁移到AWS lambda,仅部署一个静态二进制文件而没有任何依赖关系真是太好了。
答案 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 str
或u32
;后者效率更高(在搜索方式上),但是如果需要转换,则增益可以忽略。
答案 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(())
}
另请参阅: