checksum 算法

说明

  • 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能在一些情况下使用,因为数据在发送过程中交换的可能性较小,发生0/1翻转的数据不抵消就能检测到,但是应用层一些业务逻辑出现0/1翻转抵消的情况好像挺常见,因此个人对checksum的可靠性表示怀疑。

你可能感兴趣的:(算法)