4 个版本
0.2.0 | 2022 年 12 月 25 日 |
---|---|
0.1.4 | 2022 年 12 月 22 日 |
0.1.3 | 2022 年 12 月 14 日 |
0.1.2 | 2022 年 12 月 14 日 |
#1556 in 数据结构
28KB
378 行
Bloom 过滤器
Rust 中的简单 Bloom 过滤器实现。
要在此 Rust 项目中使用此软件包,只需以下依赖项之一。
安装
[dependencies]
...
bfilters = { git = "https://github.com/alexanderbakhmach/bloom-filter", branch = "<desired-branch>", version = "<desired-version>"}
例如,对于版本 0.1.1 的 dev 分支,依赖项如下。
[dependencies]
...
bfilters = { git = "https://github.com/alexanderbakhmach/bloom-filter", branch = "dev", version = "0.1.3"}
或作为已注册的创建
[dependencies]
...
bfilters = "0.1.3"
使用
以下示例展示了如何使用 Bloom 过滤器。
use bfilters::BloomFilter;
...
let items_capacity: u32 = 933_333;
let false_positive_probability: f32 = 0.04;
let mut bloom_filter: BloomFilter =
match BloomFilter::new(Some(false_positive_probability), items_capacity) {
Ok(bloom_filter) => bloom_filter,
Err(msg) => panic!("Can not create bloom filter due to error: {}", msg),
};
let item_to_save: &str = "Erc20Token";
let item_absent: &str = "Erc721Token";
bloom_filter.insert(item_to_save);
assert!(!bloom_filter.is_probably_present(item_absent));
如果 None
则 false_positive_probability 可能为空,然后它将通过公式计算。
use bfilters::BloomFilter;
...
let items_capacity: u32 = 933_333;
let mut bloom_filter: BloomFilter =
match BloomFilter::new(None, items_capacity) {
Ok(bloom_filter) => bloom_filter,
Err(msg) => panic!("Can not create bloom filter due to error: {}", msg),
};
let item_to_save: &str = "Erc20Token";
let item_absent: &str = "Erc721Token";
bloom_filter.insert(item_to_save);
assert!(!bloom_filter.is_probably_present(item_absent));
Bloom 过滤器可以以 JSON 格式进行序列化和反序列化。
use std::{fs, path::Path};
use bfilters::BloomFilter;
// Define the bloom filter state
let test_false_positive_probability: f32 = 0.01;
let test_items_count: u32 = 923578;
let test_capacity: u32 = 923578 * 10;
let test_number_of_hashes: u32 = 4;
// Define the bloom filter test items
let test_item: &str = "Vinegar";
let test_absent_item: &str = "Coke";
// Instantiate a bloom filter
let mut bloom_filter: BloomFilter = match BloomFilter::custom(
test_items_count,
Some(test_false_positive_probability),
Some(test_capacity),
Some(test_number_of_hashes),
) {
Ok(bloom_filter) => bloom_filter,
Err(msg) => panic!("{}", msg),
};
// Validate that the bloom filter is working
bloom_filter.insert(test_item);
let probably_present: bool = bloom_filter.is_probably_present(test_absent_item);
assert_eq!(probably_present, false);
// Serializing bloom filter into test tmp file
let tmp_save_path: &Path = std::path::Path::new("./bfilter_tmp.json");
bloom_filter.save(tmp_save_path).unwrap();
// Initialize a new bloom filter from the file
let mut deserialized_bloom_filter: BloomFilter = BloomFilter::from_file(tmp_save_path).unwrap();
// Validating that the deserialized bloom filter is working as before
let probably_present: bool = deserialized_bloom_filter.is_probably_present(test_absent_item);
文档
Rust 提供了一个美观的文档自动生成工具。要从项目根目录生成文档,只需运行以下命令。
cargo doc --no-deps --open
依赖项
~2.3–3.5MB
~72K SLoC