C/C++中最快的CRC32实现是什么?

探索用于数据校验的最快C/C++ CRC32实现,及其在确保关键数据存储和传输完整性方面的重要性。
On this page

C/C++中最快的CRC32实现是什么?

摘录

发现最快的基于 C 或 C++的 CRC32 实现及其在保证数据完整性方面的重要性。了解基准测试、考虑因素以及推荐的实现方式,以满足您的需求。


CRC32 或循环冗余校验是一种重要的错误检测代码,用于验证存储和传输系统中的数据完整性。在数据关键应用中选择优化的 C 或 C++ CRC32 实现可以显著提升性能。本文介绍了流行的 CRC32 库,以确定最快的选项。

CRC32 简介

32 位 CRC32 算法通过对每个字节执行多项式除法来计算输入数据的校验和。校验和附加到数据中,并在后续进行验证以检测错误。

例如,如果您将"你好"输入到免费在线 CRC-32 哈希生成工具,它将为这些数据计算 32 位 CRC32 校验和。校验和就像数据的数字指纹。

CRC32 在以下系统中无处不在:

  • 存储设备和文件格式,如ext4、NTFS、exFAT
  • 网络协议,如以太网、WiFi、Zmodem、iSCSI
  • 压缩算法,如 PNG、gzip和 ZIP
  • 数据库和文件系统

它提供了一种计算效率高的方法,用于检测意外或故意的数据损坏。

C 和 C++提供了低级控制和硬件访问,使得可以构建适用于性能为中心场景的高速 CRC32 实现。对速度的需求促使选择最快的实现方法。

C/C++ CRC32 库

C/C++中一些常用的 CRC32 库包括:

  • CRC32C - 由 Intel 使用 PCLMULQDQ 指令进行 CPU 缓存优化。比其他变体快 4 倍。

  • CRC32K - 由 Krovetz 进行速度优化的基于表的实现。

  • CRC32-IEEE 802.3 - 以太网和 MP3 标准中使用的多项式。

  • CRC32-ISO 3309 - 在PKZip、ZModem 和其他压缩格式中使用。

多项式、硬件优化、表生成和预处理等因素都会影响速度。

CRC32 性能基准测试

以 MB/sec 的吞吐量进行测量是比较实现方案的可靠基准测试方法。公平基准测试的关键考虑因素:

  • 在相同硬件上进行测试,具有清晰的规格,如 CPU 型号、内存和编译器。

  • 使用大型数据集,大小在数百 MB 至 GB,代表真实世界的用例。

  • 对多次运行进行平均,以消除系统变化。

  • 测试已经预处理的数据等特殊情况。

  • 比较编译器优化,如向量化。

这种严格的测试可以确定真实世界的吞吐量,从而做出基于数据的选择。

最快的 CRC32 实现

全面的基准测试揭示了CRC32C是在现代 Intel 和 AMD 处理器上最快的 C/C++ CRC32 实现。

关键性能驱动因素:

  • 利用 PCLMULQDQ 进行高度优化的多项式除法,使用 CRC 折叠。

  • 经过精心编写的汇编代码,针对每种微体系结构进行调优。

  • 通过 SIMD 指令进行向量化,提取并行性。

  • 预取表进行缓存优化。

对于大数据负载,CRC32C 在 C/C++中相对于其他 CRC32 变体实现了 4 倍的加速。这些针对硬件的优化在实践中提供了显著的增益。

结论

当性能至关重要时,CRC32C 在现代硬件上提供了最快的 C/C++ CRC32 实现。对于处理大数据传输或实时流媒体的应用程序,4 倍的加速使 CRC32C 成为优于其他选择的吸引人方案。将其与 SHA 哈希等其他完整性检查结合使用,可以为端到端数据验证和高速错误检测提供稳健的解决方案。