上篇RocketMQ(二):RPC通讯介绍了rocketmq的一些rpc细节,其实这些内容不仅仅是rocketmq内容,任何通信模块基本都是类似的,这块内容是高度公用的,今天我们来看看 CRC 校验,也是通信模块里面常常使用到的技术。
CRC简介CRC即[循环冗余校验码]:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC32检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC使用public static void main(String[] args) { int crc = crc32("欢迎关注:匠心零度".getBytes()); int crc1 = crc32("欢迎关注:匠心零度".getBytes()); int crc2 = crc32("欢迎关注:匠心零度!".getBytes()); System.out.println(crc==crc1); System.out.println(crc== crc2); } public static int crc32(byte[] array) { if (array != null) { return crc32(array, 0, array.length); } return 0; } public static int crc32(byte[] array, int offset, int length) { CRC32 crc32 = new CRC32(); crc32.update(array, offset, length); return (int) (crc32.getValue() & 0x7FFFFFFF); }