基本概念
CRC(Cyclic Redundancy Check,循环冗余校验),其实是个很古老的数据校验方法了,记得以前大学<<微机原理>>和<<微机原理与接口技术>>课程都对其进行了介绍,其校验准确度较之普通的奇偶校验、校验和等方法更高,当然计算也略微复杂;较之MD5、SHA1等算法,CRC安全性和准确度方面又略显不足,但计算较之这两者明显简单,效率更高。所以如果仅仅针对网络数据的一致性校验,即收发端数据的是否一致(因为在Socket编程里,单次收到数据的长度和发送数据的长度即使在阻塞模式下,也不一定是相同的,这个依赖于网络环境,虽然TCP协议保证了数据的完整性和一致性,但像这种人为对数据进行了分片的情况,在收到数据时视情况还是有必要进行一下校验),针对这种校验要求,CRC32是明显足够,也不会带来很大的计算负担。
CRC32的C语言实现
关于CRC32(即校验码是32位)实现理论原理,这里不多说,网上有大把的资料,这里主要探究一下怎样用C语言高效的实现CRC32校验算法。
下面的算法用到了查找表的方法,这也是比较常见的以空间换时间的思想。
对于以按字节校验的CRC算法实现中,一个字节8bit,取值范围0~255,每个字节均是如此。因此可以生成一个0~255所有数的校验结果的数组,以后就是取这个数组的值就可以了。
查找表实现代码: