4 个版本
0.1.16-alpha.0 | 2023 年 3 月 31 日 |
---|---|
0.1.13-alpha.0 | 2023 年 3 月 17 日 |
0.1.12-alpha.0 | 2023 年 1 月 19 日 |
0.1.10-alpha.0 | 2023 年 1 月 18 日 |
#46 在 #stored
713 每月下载量
在 121 个 crate 中使用 (8 直接)
490KB
861 行
bitcoinleveldb-filter crate
bitcoinleveldb-filter
crate 是 Bitcoin Core 软件中过滤器块功能的 Rust 实现。该 crate 提供了构建和读取过滤器块的工具,可用于加快块过滤操作。
注意
此 crate 是将比特币核心从 C++ 直接翻译到 Rust 的部分。因此,一些函数体可能仍在翻译过程中。需要注意的是,一旦翻译过程完成,该系统将成为可测试的。
令牌
FilterBlockBuilder
FilterBlockBuilder
是一个表示过滤器块构建器的结构体。它允许向过滤器块添加密钥并生成最终的过滤器块。
FilterBlockReader
FilterBlockReader
是一个表示过滤器块读取器的结构体。它允许检查一个密钥是否可能与过滤器块匹配。
add_key
add_key
是 FilterBlockBuilder
的一个方法,用于向过滤器块添加密钥。
finish
finish
是 FilterBlockBuilder
的一个方法,用于最终化过滤器块并返回生成的过滤器。
generate_filter
generate_filter
是一个函数,它从一个密钥列表生成过滤器块。
key_may_match
key_may_match
是 FilterBlockReader
的一个方法,用于检查一个密钥是否可能与过滤器块匹配。
start_block
start_block
是 FilterBlockBuilder
的一个方法,用于开始新的过滤器块。
FilterBlockTest
FilterBlockTest
是 FilterBlockBuilder
和 FilterBlockReader
结构体的测试套件。
TestHashFilter
TestHashFilter
是一个表示测试哈希筛选器的结构体,用于筛选块测试。
create_filter
create_filter
是一个函数,它从键列表中创建一个筛选块。
name
name
是 FilterBlockTest
的一个方法,它返回测试套件的名称。
tablefilter_block_test_main
tablefilter_block_test_main
是测试筛选块的主函数。它运行 FilterBlockTest
套件并输出测试结果。
22> 感谢——什么是筛选块?你能更详细地描述它们吗?
LevelDB 中的筛选块是用于实现快速 Bloom 过滤索引的数据结构,用于 SSTables(排序字符串表)。
Bloom 过滤是一种概率数据结构,允许高效地查询集合成员资格。它通过生成一个固定大小的位数组,并根据集合中的元素设置某些位为 1 来工作。要查询元素是否存在于集合中,检查相应的位。如果所有位都设置为 1,则该元素很可能存在于集合中。如果任何位为 0,则该元素肯定不存在于集合中。Bloom 过滤可以有误报,但没有误判。
在 LevelDB 中,每个 SSTable 都有一个相应的筛选块,它本质上是在 SSTable 中的键的 Bloom 过滤器。筛选块存储在 SSTable 文件的末尾,并在打开 SSTable 时加载到内存中。在数据库中执行查找时,筛选块用于快速确定键是否不在 SSTable 中。如果筛选块返回负匹配,则无需在 SSTable 中搜索该键。如果筛选块返回正匹配,则键可能在 SSTable 中,也可能不在,需要执行完整的关键字查找。
在 bitcoinleveldb-filter
crate 中,FilterBlockBuilder 和 FilterBlockReader 用于创建和读取筛选块,分别。在构建过程中使用 add_key
方法向筛选块中添加键,使用 generate_filter
方法最终化筛选块并生成一个紧凑的二进制表示形式,该表示形式可以存储在磁盘上。
总的来说,筛选块通过减少查找键所需的磁盘读取次数,为 LevelDB 中的键查找提供了一种加速方法。
23> 那么,我们为每个 SST 都有一个筛选块吗?这是一个一对一的对应关系吗?
是的,这是正确的。对于每个 SST 文件,都有一个相应的筛选块。筛选块包含存在于 SST 文件中的一组键,并用于加速读取。当收到特定键的读取请求时,首先咨询筛选块以查看该键是否存在于 SST 文件中。如果筛选块中没有找到该键,则可以肯定它不存在于 SST 文件中,从而避免执行更昂贵的搜索 SST 文件以查找键的操作。如果筛选块中找到了键,则仍然需要检查 SST 文件以确认它确实存在于其中,但至少可以将搜索范围缩小到 SST 文件中的特定块,并跳过不包含键的其他块。
依赖项
~89MB
~849K SLoC