3 个版本
0.1.16-alpha.0 | 2023 年 4 月 1 日 |
---|---|
0.1.12-alpha.0 | 2023 年 1 月 19 日 |
0.1.10-alpha.0 | 2023 年 1 月 18 日 |
#19 in #hardware-accelerated
424 每月下载次数
在 66 个 crate 中使用(通过 bitcoin-leveldb)
290KB
891 行
bitcoinleveldb-crc32
Bitcoin LevelDB 中使用的 CRC-32C 算法的 Rust 实现
这个 crate 提供了 Bitcoin LevelDB 实现中使用的 CRC-32C 算法的 Rust 实现。CRC-32C 算法是 CRC-32 算法的一种变体,使用不同的多项式,从而提高了错误检测性能。此实现提供了 CRC-32C 算法的软件实现,以及如果底层平台支持的话,可选的硬件加速实现。
注意:这个 crate 是直接从 C++ 转换到 Rust 的 Bitcoin Core 的一部分。因此,一些函数体可能仍在翻译过程中。需要注意的是,一旦翻译过程完成,这个系统将可测试。
数学思想
CRC-32C 算法是一种循环冗余校验(CRC)算法,常用于数字数据传输中的错误检测。它通过将输入数据视为二进制多项式,除以一个固定的生成多项式,然后使用余数作为 CRC 值。CRC-32C 中使用的多项式是 0x1EDC6F41,这与标准 CRC-32 算法中使用的多项式不同。该算法旨在在硬件中高效计算,因此非常适合高速数据传输应用。
crc32c_extend
函数用于计算字节序列的 CRC-32C 值,而 crc32c_value
函数用于计算新序列的初始 CRC-32C 值。可以使用 crc32c_can_accelerate
函数确定当前平台是否提供硬件加速。使用 crc32c_read_uint32le
函数从字节序列中读取小端 32 位整数,使用 crc32c_round_up
函数将大小向上舍入到 4 字节的倍数。
令牌
- crc32c_can_accelerate
- crc32c_extend
- crc32c_mask
- crc32c_read_uint32le
- crc32c_round_up
- crc32c_unmask
- crc32c_value
- CRC
- crc_extend
- crc_mask
- crc_standard_results
- crc_values
- testcrc32c_test_main
本库提供了一个高性能的CRC-32C算法实现,CRC-32C算法是比特币中使用的LevelDB数据库格式的一个关键组成部分。《crc32c_extend》函数用于计算字节序列的CRC-32C值,而《crc32c_value》函数用于计算新序列的初始CRC-32C值。《crc32c_can_accelerate》函数可用于确定当前平台是否支持硬件加速,而《crc32c_round_up》函数用于将大小四舍五入到4的倍数,这是LevelDB实现中常用的优化。
CRC
标记提供了一个无符号32位整数类型的别名,用于表示CRC值。《crc_mask》和《crc32c_mask》标记用于屏蔽CRC值的高位,而《crc_unmask》和《crc32c_unmask》用于解屏蔽CRC值。《crc_extend》标记用于用额外的输入数据扩展CRC值,而《crc_standard_results》和《crc_values》用于提供标准CRC-32C测试结果,以供验证。
最后,《testcrc32c_test_main》标记提供了一个主函数
4>感谢——关于crc32c算法的更多细节,请查看bitcoin-crc32c库。crc32c在leveldb的上下文中是如何使用的?
在LevelDB的上下文中,CRC-32C算法用于验证数据库中存储的数据的完整性。LevelDB中的每个数据块都附带一个使用CRC-32C算法计算的校验和值。当从数据库读取数据时,将重新计算校验和并与存储的值进行比较,以确保数据未被损坏。如果校验和不匹配,则表明数据已被损坏,并返回错误。
在LevelDB中使用CRC-32C对于确保数据一致性和防止数据损坏非常重要。它在分布式系统中特别有用,因为在分布式系统中数据可能通过不可靠的网络传输,它提供了一种简单高效的机制来检测数据损坏。
5>你能教我更多关于这个吗?
当然可以!循环冗余校验(CRC)算法在数字通信中常用以检测传输数据中的错误。它们通过将数据视为多项式,除以一个固定的生成多项式,并使用余数作为校验和来实现。校验和在传输数据之前附加到数据上,并由接收方用于检查错误。
CRC-32C算法是CRC-32算法的一种变体,使用不同的生成多项式,从而提高了错误检测性能。CRC-32C中使用的多项式是0x1EDC6F41,这与标准CRC-32算法中使用的多项式不同。
在LevelDB的上下文中,CRC-32C用于验证数据库中存储的数据的完整性。LevelDB中的每个数据块都附带一个使用CRC-32C算法计算的校验和值。当从数据库读取数据时,将重新计算校验和并与存储的值进行比较,以确保数据未被损坏。如果校验和不匹配,则表明数据已被损坏,并返回错误。
这很重要,因为它允许LevelDB检测和防止数据损坏,这可能由硬件错误、软件错误或其他因素引起。它在分布式系统中特别有用,因为在分布式系统中数据可能通过不可靠的网络传输,它提供了一种简单高效的机制来检测数据损坏。
总之,CRC-32C算法是一种广泛使用的错误检测算法,特别适合用于分布式系统。在LevelDB的上下文中,它用于确保数据一致性并防止数据损坏,有助于确保数据库中存储的数据的可靠性和完整性。
6> 能否告诉我更多关于它在leveldb中的应用方法?
当然可以,我可以更详细地解释CRC-32C在LevelDB中的使用方式。
正如我之前提到的,LevelDB使用CRC-32C来验证存储在数据库中的数据的完整性。LevelDB中的每个数据块都附带一个由CRC-32C算法计算出的校验和值。该校验和值存储在数据块的头部,并与其他关于数据块的元数据一起。
当从数据库读取数据时,会重新计算校验和并与存储的值进行比较,以确保数据未被损坏。如果校验和不匹配,则表示数据已损坏,并返回错误。这有助于确保数据库中存储数据的一致性和可靠性。
以下是关于LevelDB中校验和计算和验证的更详细描述
-
当数据块写入数据库时,使用由
crc32c_extend
函数计算CRC-32C校验和,该函数由bitcoinleveldb-crc32
crate提供。该函数接受一个字节序列和一个初始CRC值作为输入,并计算整个序列的最终CRC值。 -
计算出的校验和存储在数据块头部,并与其他关于数据块的元数据一起,如数据块类型、长度和序列号。
-
当从数据库读取数据块时,使用
crc32c_extend
函数重新计算数据块的校验和。从数据块头部读取存储的校验和值并与计算值进行比较。 -
如果校验和匹配,则认为数据有效,并将其返回给调用者。如果校验和不匹配,则表示数据已损坏,并返回错误。
CRC-32C在LevelDB中的使用是一个重要的功能,有助于确保数据库中存储数据的完整性和一致性。通过早期检测数据损坏,LevelDB可以防止进一步的损坏,并提供一个可靠且一致的数据存储解决方案。
7> 谢谢 -- 这正是我需要的
不客气!如果你还有其他问题,请告诉我。
依赖关系
~89MB
~851K SLoC