EncodableBloomFilter
符合 Swift 的 Codable
序列化协议的 Bloom 过滤器数据结构实现。
安装
Swift 包管理器
在 Xcode 或通过将参考添加到您的 Package.swift
中的 dependencies
数组,将 https://github.com/metabolist/codable-bloom-filter.git
添加为依赖项。
dependencies: [
.package(name: "CodableBloomFilter", url: "https://github.com/metabolist/codable-bloom-filter.git", .upToNextMajor(from: "1.0.0"))
],
用法
为了使类型能在 bloom 过滤器中使用,它必须符合 DeterministicallyHashable
协议。包括 Data
和 String
的实现。
Bloom 过滤器使用一组哈希函数和字节计数初始化。EncodableBloomFilter 提供了 5 种不同的哈希函数(DJB2、DJB2a、SDBM、FNV1 和 FNV1a 的 32 位版本)。有关确定您用例中的哈希函数数量和大小的信息,请参见 https://en.wikipedia.org/wiki/Bloom_filter#Optimal_number_of_hash_functions。
请注意,以下示例中使用8个字节的长度以保持输出可读,但在实际应用中,你可能需要一个更大的值。
布隆过滤器可以像集合
一样使用。
var bloomFilter = BloomFilter<String>(hashes: [.sdbm32, .djb232], byteCount: 8)
bloomFilter.insert("string")
bloomFilter.contains("string") // returns true
bloomFilter.contains("other string") // returns false
序列化布隆过滤器
let data = try JSONEncoder().encode(bloomFilter)
// `data` will be JSON data equivalent to "{"hashes":["djb232","sdbm32"],"data":"AAAAAAAAAhA="}"
反序列化布隆过滤器
let bloomFilter = try JSONDecoder().decode(BloomFilter<String>.self, from: data)
支持使用自定义的dataEncodingStrategy
/ dataDecodingStrategy
。例如,可以将数据序列化为十六进制字符串。
let encoder = JSONEncoder()
encoder.dataEncodingStrategy = .custom { data, encoder in
var container = encoder.singleValueContainer()
try container.encode(data.map { String(format: "%02.2hhx", $0) }.joined())
}
let data = try encoder.encode(bloomFilter)
// `data` will be JSON data equivalent to "{"hashes":["djb232","sdbm32"],"data":"0000000000000210"}"
布隆过滤器可以从Data
中初始化。要初始化上面的布隆过滤器
let bloomFilter = BloomFilter<String>(hashes: [.sdbm32, .djb232], data: Data([0, 0, 0, 0, 0, 0, 2, 16]))
可以通过布隆过滤器的data
属性来访问其数据。
let data = bloomFilter.data // `data` will be equivalent to `Data([0, 0, 0, 0, 0, 0, 2, 16])`
许可证
CodableBloomFilter遵循MIT许可证。查阅LICENSE获取详细信息。