• CRC 校验


    匠心零度 转载请注明原创出处,谢谢!

    说明

    上篇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);
        }
    

    输出结果:

    true
    false
    

    rocketmq部分使用

    crc32 JDK内部实现

    通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。

    备注: 具体实现细节没有去细细了解,需要了解的请自行深入学习。


    如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!

    加入知识星球,一起探讨!

  • 相关阅读:
    高级特性(4)- 数据库编程
    UVA Jin Ge Jin Qu hao 12563
    UVA 116 Unidirectional TSP
    HDU 2224 The shortest path
    poj 2677 Tour
    【算法学习】双调欧几里得旅行商问题(动态规划)
    南洋理工大学 ACM 在线评测系统 矩形嵌套
    UVA The Tower of Babylon
    uva A Spy in the Metro(洛谷 P2583 地铁间谍)
    洛谷 P1095 守望者的逃离
  • 原文地址:https://www.cnblogs.com/jiangxinlingdu/p/8759027.html
Copyright © 2020-2023  润新知