moon add SupremeHuaji/BloomierFilter let config = BloomierConfig::{
expected_elements: 1000,
false_positive_rate: 0.01,
hash_functions: None, // Auto-calculate optimal count
}
let filter = @BloomierFilter.new(config)
// Or create from existing data
let items = [("apple", "red"), ("banana", "yellow"), ("grape", "purple")]
let filter2 = @BloomierFilter.from_array(items, config) let config = BloomierConfig::{
expected_elements: 100,
false_positive_rate: 0.01,
hash_functions: Some(3),
}
let filter = @BloomierFilter.new(config)
match filter.insert("fruit", "apple") {
InsertResult::Success => println("插入成功")
InsertResult::NeedRehash => println("需要重新哈希")
InsertResult::Failure => println("插入失败")
}
let config = BloomierConfig::{
expected_elements: 100,
false_positive_rate: 0.01,
hash_functions: Some(3),
}
let filter = @BloomierFilter.from_array([
("name", "Alice"), ("age", "25"), ("city", "Beijing")
], config)
match filter.get("name") {
QueryResult::Found(value) => println("找到值: \{value}")
QueryResult::Uncertain => println("结果不确定,可能存在冲突")
QueryResult::NotFound => println("键不存在")
}
// Simple existence check
if filter.contains("age") {
println("年龄信息存在")
} let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.01,
hash_functions: Some(2),
}
let filter = @BloomierFilter.from_array([
("a", "1"), ("b", "2"), ("c", "3")
], config)
println("过滤器大小: \{filter.size()}")
println("负载因子: \{filter.load_factor()}")
if filter.needs_resize(0.8) {
println("建议扩容")
}
let stats = filter.stats()
println("统计信息: \{stats}") let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.01,
hash_functions: Some(2),
}
let filter = @BloomierFilter.from_array([
("a", "1"), ("b", "2"), ("c", "3")
], config)
println("过滤器大小: \{filter.size()}")
println("负载因子: \{filter.load_factor()}")
if filter.needs_resize(0.8) {
println("建议扩容")
}
let stats = filter.stats()
println("统计信息: \{stats}") let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.01,
hash_functions: Some(2),
}
let filter = @BloomierFilter.from_array([("x", "10"), ("y", "20")], config)
println("清空前大小: \{filter.size()}")
filter.clear()
println("清空后大小: \{filter.size()}")
assert_true!(filter.is_empty()) let config = BloomierConfig::{
expected_elements: 20,
false_positive_rate: 0.01,
hash_functions: Some(3),
}
let filter = @BloomierFilter.new(config)
// Batch insert
let items = [("user1", "admin"), ("user2", "guest"), ("user3", "user")]
let results = filter.insert_all(items)
for i = 0; i < results.length(); i = i + 1 {
let (key, _) = items[i]
match results[i] {
InsertResult::Success => println("\{key} 插入成功")
_ => println("\{key} 插入遇到问题")
}
}
// Batch query
let keys = ["user1", "user2", "user3", "user4"]
let query_results = filter.get_all(keys)
for i = 0; i < query_results.length(); i = i + 1 {
match query_results[i] {
QueryResult::Found(value) => println("\{keys[i]} -> \{value}")
_ => println("\{keys[i]} 未找到或不确定")
}
} let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.01,
hash_functions: Some(2),
}
let filter = @BloomierFilter.from_array([
("language", "MoonBit"), ("paradigm", "functional"), ("type", "static")
], config)
// Iterate through all values
filter.iter_values(fn(value) {
println("存储的值: \{value}")
})
// Collect all values to array
let all_values = filter.values()
println("所有值: \{all_values}") let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.01,
hash_functions: Some(2),
}
let filter = @BloomierFilter.from_array([
("session1", "active"), ("session2", "expired")
], config)
// Serialize
let serialized = filter.serialize()
println("序列化版本: \{serialized.version}")
// Deserialize
let restored_filter : @BloomierFilter.BloomierFilter[String, String] =
@BloomierFilter.deserialize(serialized)
println("恢复后大小: \{restored_filter.size()}")
assert_eq!(restored_filter.size(), filter.size()) let config = BloomierConfig::{
expected_elements: 10,
false_positive_rate: 0.05,
hash_functions: Some(2),
}
let filter = @BloomierFilter.new(config)
let items = [("key1", "val1"), ("key2", "val2"), ("key3", "val3")]
// Insert initial data
for item in items {
let (key, value) = item
ignore(filter.insert(key, value))
}
// Rehash with same data if needed
filter.rehash_with_items(items)
// Resize to larger capacity
let original_size = filter.stats().table_size
filter.resize(original_size * 2, items)
println("新表大小: \{filter.stats().table_size}") let config = BloomierConfig::{
expected_elements: 20,
false_positive_rate: 0.1,
hash_functions: Some(2),
}
let filter = @BloomierFilter.new(config)
ignore(filter.insert("ambiguous", "value1"))
// Due to hash collisions, queries might be uncertain
match filter.get("ambiguous") {
QueryResult::Found(value) => {
println("确定找到: \{value}")
}
QueryResult::Uncertain => {
println("结果不确定,可能的值:")
let possible_values = filter.get_all_values("ambiguous")
for value in possible_values {
println(" - \{value}")
}
}
QueryResult::NotFound => {
println("确定不存在")
}
}| Operation | Time Complexity | Space Complexity |
|---|---|---|
| @BloomierFilter.new() | O(m) | O(m) |
| insert() | O(k) | O(1) |
| get() / contains() | O(k) | O(1) |
| get_all_values() | O(k) | O(k) |
| clear() | O(m) | O(1) |
| insert_all() | O(n×k) | O(1) |
| serialize() | O(m) | O(m) |
BloomierConfig::{
expected_elements: Int, // Expected number of key-value pairs
false_positive_rate: Double, // Desired false positive rate (0.0 to 1.0)
hash_functions: Option[Int], // Number of hash functions (None for auto)
}| Feature | Bloom Filter | Bloomier Filter |
|---|---|---|
| Storage | Bits only | Key-value pairs |
| Query Result | Bool | QueryResult[V] |
| False Positives | "Maybe exists" | "Maybe wrong value" |
| Space Usage | Very low | Moderate |
| Use Cases | Set membership | Associative cache |
pub(all) struct BloomierConfig {
expected_elements : Int
false_positive_rate : Double
hash_functions : Int?
}impl Eq for BloomierConfigimpl Show for BloomierConfigpub(all) enum BloomierError {
InsufficientCapacity
UnresolvableConflict
InvalidParameters(String)
BuildFailure(String)
}impl Eq for BloomierFilter[K, V]impl Show for BloomierFilter[K, V]filter.clear()
assert_eq!(filter.size(), 0)if filter.contains("key") {
println("键可能存在")
} else {
println("键一定不存在")
}match filter.get("key") {
Found(value) => println("找到值: \{value}")
NotFound => println("未找到")
Uncertain => println("可能存在")
}fn[K : Hash + Eq, V] BloomierFilter::get_all(self : BloomierFilter[K, V], keys : Array[K]) -> Array[QueryResult[V]]fn[K : Hash + Eq, V] BloomierFilter::get_all_values(self : BloomierFilter[K, V], key : K) -> Array[V]fn[K : Hash + Eq, V] BloomierFilter::insert(self : BloomierFilter[K, V], key : K, value : V) -> InsertResultmatch filter.insert("key", "value") {
Success => println("插入成功")
Failure => println("插入失败")
NeedRehash => println("需要重新哈希")
}fn[K : Hash + Eq, V] BloomierFilter::insert_all(self : BloomierFilter[K, V], items : Array[(K, V)]) -> Array[InsertResult]if filter.is_empty() {
println("过滤器为空")
}fn[K : Hash + Eq, V] BloomierFilter::rehash_with_items(self : BloomierFilter[K, V], items : Array[(K, V)]) -> Unitfn[K : Hash + Eq, V] BloomierFilter::resize(self : BloomierFilter[K, V], new_size : Int, items : Array[(K, V)]) -> Unitlet serialized = filter.serialize()println("当前存储了 \{filter.size()} 个元素")let stats = filter.stats()
println("负载因子: \{stats.load_factor}")pub struct BloomierStats {
table_size : Int
stored_elements : Int
load_factor : Double
hash_functions : Int
free_slots : Int
}pub(all) enum InsertResult {
Success
Failure
NeedRehash
}pub(all) enum QueryResult[V] {
Found(V)
NotFound
Uncertain
}impl Eq for QueryResult[V]impl Show for QueryResult[V]impl Eq for SerializedBloomier[V]impl Show for SerializedBloomier[V]let filter = @BloomierFilter.deserialize(serialized_data)!fn[K : Hash + Eq, V] from_array(items : Array[(K, V)], config : BloomierConfig) -> BloomierFilter[K, V]let items = [("key1", "value1"), ("key2", "value2")]
let filter = @BloomierFilter.from_array(items, config)let config = { expected_elements: 1000, false_positive_rate: 0.01, hash_functions: None }
let filter = @BloomierFilter.new(config)Install
Download zip