#bloom-filter

bfilters

Rust 中的简单 Bloom 过滤器实现

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));

如果 Nonefalse_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