说明
上篇 RocketMQ(二):RPC 通讯 http://mp.weixin.qq.com/s/SWt6kCbvpYzUXPxdc0RnZA 介绍了 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);
- }
输出结果:
true false
rocketmq 部分使用
crc32 JDK 内部实现
通过反复的移位和进行 CRC 的除法, 最终该寄存器中的值就是我们所要求的余数.
备注: 具体实现细节没有去细细了解, 需要了解的请自行深入学习.
来源: https://juejin.im/post/5ac98a81f265da239612a6d9