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

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规范标准条件下

时间: 2024-11-08 09:01:20

读Redis学C语言设计之三:CRC数据校验的相关文章

Hadoop中的CRC数据校验文件

错误分析: 今天在A程序中生成了数据,然后将A结果数据作为B的输入数据,在查看A结果数据时候,发现有一条数据不符合规则,遂将其删除,删除后执行B程序则报错.尝试打断点,发现程序连map过程都不执行,到了 job.waitForCompletion(true);这一步之后直接就报错了,错误信息为: org.apache.hadoop.fs.ChecksumException: Checksum error: file:/E:/hdpSapce/web_log/out/golden/part-m-0

读Redis学C程序设计一:怎么实现rand

在开始这个系列之前,首先说说什么是redis.redis是一个ANSI C编写的高性能Key-Value内存数据库,也是现在nosql数据库的代表之一.通过对redis2.8.17代码行数进行了统计,包括注释总共大约5万行,在开源家族里面算是非常短小精悍了,而且项目从2009年开始,距离现在很近,代码风格也非常适合我们80,90后程序员的知识结构.当具备一定编码经验之后,优秀的源码是我们最好的老师,尤其是已经被实践验证了的代码.特别由于最近正在苦读APUE和UNP,读到许多东西还是感到疑惑,而这

读Redis学C程序设计二:内存分配

内存分配对于C程序来说是一个核心问题,许多开源软件都会针对自己软件的需要定制自己的内存分配策略,redis也不例外.然而总的来说,redis并不是专门去管内存分配的东西,它的内存分配策略的最大特点在于加上了统计信息,这一点很重要.毕竟,redis是一个内存数据库,知道自己用了多少内存,还有多少内存可用是它非常需要关注的问题.我们来看zmalloc里面的内容. 首先在zmalloc.h里面 #if defined(USE_TCMALLOC) #define ZMALLOC_LIB ("tcmall

边看MHA源码边学Perl语言之三 NodeUtil.pm

边看MHA源码边学Perl语言之三 NodeUtil.pm NodeUtil.pm源码分析 MHA的代码分为mha4mysql-manager(管理节点)和mha4mysql-node(数据库节点)两部分,可能有些人认为mha4mysql-node只需要安装在数据库节点就可以了,但通过源码可看出,在管理点节也是需要安装node节点,因为在manager节点也会调用NodeUtil中的方法.以下为加过comment的mha4mysql-node的代码: #!/usr/bin/env perl #

【C】 01 - 再学C语言

"C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了".这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有人会回头再仔细看看它.但在现实中却经常会有一些令人抓狂的bug,最终发现竟是语法使用错误造成的,而作者不乏老程序员.仔细想想,其实每个人对C都有些含糊不清的地方,C好像又变得复杂起来.但事实却不是这样,C语言依然是简洁的,它的语法只需几页纸便可讲清.回想起来,其实是我们学得太过匆忙.太过功

跟着数百万人编程导师学C语言!

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书 --异步小编 为什么说这不是一本完全C语言的书?因为<"笨办法"学C语言>不仅仅是一本书,随书附赠5个多小时充满激情的视频,这是一套完整的C语言视频课程! 这本书刚拿到样书,运营经理兴奋的发来消息:"手机扫码看视频,太方便了,速度也很快,配的字幕也很赞!"而本书的责编杨海玲老师很淡定:"这个是我尝试的第一本扫码看视频的书,虽然遇到些问

SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则

上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法,新设计的内存管理管理单元要实现虚拟内存管理还需要操作系统.代码分块(Bank)的支持,详见SoC嵌入式软件架构设计之二:没有MMU的CPU实现虚拟内存管理的设计方法.这里要阐述Bank设计的一些原则. Bank设计是为了实现不同时刻运行的Bank(代码块)运行在同一块内存上,所以在运行之前操作系统需要将已存在内存的代码/数据进行缓存处理,并加载将要运行的Ba

Linux下零基础学C语言、C++系列实战视频教程

Linux下零基础跟我学C语言.C++系列实战教程(入门篇.项目实战与提高篇.软件设计与工程实践篇)适合人群:初级课时数量:194课时用到技术:C++涉及项目:windows版服务器端开发咨询qq:1840215592Linux下零基础学C语言.C++系列实战视频教程详细介绍:http://www.dwz.cn/Fk3mk1.1跟我一起学C(linux)课程详细介绍01.从helloworld程序认识计算机(一)Helloword程序什么是程序程序语言C程序执行环境02.从helloworld程

Web前端开发需要学什么语言?

前端框架一般指用于简化网页设计的框架,比如,jquery,extjs,bootstrap等等,这些框架封装了一些功能,比如html文档操作,漂亮的各种控件(按钮,表单等等). Web前端开发需要学什么语言?Web前端开发主要学习html.css.js.jquery等等,除了学习开发语言,还要为网站上提供的产品和服务实现一流的Web界面,优化代码并保持良好兼容性; Web前端表现层及与前后端交互的架构设计和开发; 配合后台开发人员实现产品界面和功能; 利用各种Web技术模拟开发产品原型; Web新