#leveldb #bitcoin #hardware-accelerated #portable #polynomial #crc32 #crc-32c

bitcoinleveldb-crc32

比特币 LevelDB 中使用的 crc32c 的便携式实现

3 个版本

0.1.16-alpha.02023 年 4 月 1 日
0.1.12-alpha.02023 年 1 月 19 日
0.1.10-alpha.02023 年 1 月 18 日

#19 in #hardware-accelerated

Download history 297/week @ 2024-03-26 191/week @ 2024-04-02 114/week @ 2024-04-09 177/week @ 2024-04-16 145/week @ 2024-04-23 136/week @ 2024-04-30 145/week @ 2024-05-07 139/week @ 2024-05-14 146/week @ 2024-05-21 131/week @ 2024-05-28 115/week @ 2024-06-04 77/week @ 2024-06-11 185/week @ 2024-06-18 111/week @ 2024-06-25 15/week @ 2024-07-02 110/week @ 2024-07-09

424 每月下载次数
66 个 crate 中使用(通过 bitcoin-leveldb

MIT 许可证

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中校验和计算和验证的更详细描述

  1. 当数据块写入数据库时,使用由crc32c_extend函数计算CRC-32C校验和,该函数由bitcoinleveldb-crc32 crate提供。该函数接受一个字节序列和一个初始CRC值作为输入,并计算整个序列的最终CRC值。

  2. 计算出的校验和存储在数据块头部,并与其他关于数据块的元数据一起,如数据块类型、长度和序列号。

  3. 当从数据库读取数据块时,使用crc32c_extend函数重新计算数据块的校验和。从数据块头部读取存储的校验和值并与计算值进行比较。

  4. 如果校验和匹配,则认为数据有效,并将其返回给调用者。如果校验和不匹配,则表示数据已损坏,并返回错误。

CRC-32C在LevelDB中的使用是一个重要的功能,有助于确保数据库中存储数据的完整性和一致性。通过早期检测数据损坏,LevelDB可以防止进一步的损坏,并提供一个可靠且一致的数据存储解决方案。

7> 谢谢 -- 这正是我需要的

不客气!如果你还有其他问题,请告诉我。

依赖关系

~89MB
~851K SLoC