摘录
发现最快的基于 C 或 C++的 CRC32 实现及其在保证数据完整性方面的重要性。了解基准测试、考虑因素以及推荐的实现方式,以满足您的需求。
CRC32 或循环冗余校验是一种重要的错误检测代码,用于验证存储和传输系统中的数据完整性。在数据关键应用中选择优化的 C 或 C++ CRC32 实现可以显著提升性能。本文介绍了流行的 CRC32 库,以确定最快的选项。
CRC32 简介
32 位 CRC32 算法通过对每个字节执行多项式除法来计算输入数据的校验和。校验和附加到数据中,并在后续进行验证以检测错误。
例如,如果您将"你好"输入到免费在线 CRC-32 哈希生成工具,它将为这些数据计算 32 位 CRC32 校验和。校验和就像数据的数字指纹。
CRC32 在以下系统中无处不在:
它提供了一种计算效率高的方法,用于检测意外或故意的数据损坏。
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 哈希等其他完整性检查结合使用,可以为端到端数据验证和高速错误检测提供稳健的解决方案。