EncodableBloomFilter 1.0.0

EncodableBloomFilter 1.0.0

Metabolist 维护。



  • Metabolist

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 协议。包括 DataString 的实现。

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获取详细信息。