读Redis学C语言设计之三:CRC数据校验

Redis在处理网络传输和RDB备份时采用CRC64数据校验来确保数据准确性。CRC检验是一种在数据序列后附加检验码的技术,通过检查数据序列与检验码之间的特定关系来检测错误。Redis的CRC算法使用了64位的多项式,常见的生成多项式为x^64 + x^4 + x^3 + x + 1。

       Redis里面在网络传输和RDB备份的时候都会面临着数据出错的问题,因此采用了数据的校验。包括使用了CRC64的校验算法。CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。Redis里面的CRC算法实现如下:

uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l) {
    uint64_t j;

    for (j = 0; j < l; j++) {
        uint8_t byte = s[j];
        crc = crc64_tab[(uint8_t)crc ^ byte] ^ (crc >> 8);
    }
    return crc;
}

其中crc64_tab里保存的是每个字符中的多项式:码字长度为64bit的CRC编码。常用的生成多项式有:

x^64 + x^4 + x^3 + x + 1

从C语言的设计来讲,因为字符uchar是0-255的值,对这个多项式只有256个离散值,因此可以使用一个tab保存。因此就有一个crc64_tab。在校验的时候就是发出一个原信息和一个crc校验码。只要接收方讲接受信息和校验码取余就可以看出是否有错。如果取余为0,则说明传输没有错。
尽管CRC在错误检测中非常有用,但CRC并不能可靠地校验数据完整性,这是因为CRC多项式是线性结构,可以非常容易地通过改变数据方式达到CRC碰撞,这里给一个更加通俗的解释,假设一串带有CRC校验的代码在传输中,如果连续出现差错,当出错次数达到一定次数时,那么几乎可以肯定会出现一次碰撞(值不对但CRC结果正确),但随着CRC数据位增加,碰撞几率会显著降低,比如CRC32比CRC16具有更可靠的验证性,CRC64又会比CRC32更可靠,当然这都是按照ITU规范标准条件下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值