欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

checksum 算法

程序员文章站 2022-07-10 18:38:55
...

说明

  • checksum:总和检验码,校验和,可以理解为check(校验),sum(和)。
  • 在数据处理和通信领域,通过一定算法对传输的数据进行求和以校验数据的完整性和准确性。

使用

算法

  • 求和的算法大致是确定的,但是一些细节不是很重要,例如:校验和使用几个字节存储,只要收发两边处理规则一样就行。
  • 网上示例,如下:
USHORT CICMP::CheckSum(USHORT *buff,int Size)
{
    unsigned long cksum = 0;
    //将数据以字为单位累加到cksum中
    while (Size > 1)
    {
        cksum += *buff;
        Size -= sizeof(USHORT);
    }
    //如果为奇数,将最后一个字节扩展到双字,在累加到cksum中
    if (Size)
    {
        cksum += *(UCHAR*)buff;
    }
    //将cksum的高16位和低16位相加,取反后得到效验和
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
    return (USHORT)(~cksum);//位运算符号:位取反!比如有int a=3;则先把十进制数3,转化为二进制数,即00000011.那么~a=11111100
}

流程

  1. 在数据发送端对数据进行checksum。
  2. 将计算出的checksum取反,存放在数据末尾或其它位置发送给接收端。
  3. 接收端收到数据后对所有数据进行checksum,如果checksum为0表示数据正确。

原理

  • checksum为0表示数据正确原因:除了数据中的checksum值,其它数据的sum值等于checksum取反,两值相加值的所有位为1,再取反后即为0,也就是所有数据的checksum为0。
  • 如果所有数据的checksum不为0说明数据发生过变化,因此数据是无效的。

个人理解

  1. checksum算法是不可靠的,只能在要求不是很严格的情况下使用,无法用来判断数据是否一致。
  • checksum算法中每个数据都是位置无关的,因此该算法无法检测出数据发生交换,测试可知:数据发生交换c不会影响hecksum。
  • checksum能在一些情况下使用,因为数据在发送过程中交换的可能性较小,发生01翻转的数据不抵消就能检测到,但是应用层一些业务逻辑出现01翻转抵消的情况好像挺常见,因此个人对checksum的可靠性表示怀疑。
相关标签: 算法