有同学问到 checksum table在逻辑备份时候前后是否可以用于验证数据一致性。扩展一下发现有一些有趣的问题,比如数据插入顺序不同、表引擎不同、操作系统位数不同等。
插入顺序不同是否有影响
我们知道全表扫描是可以有很多种顺序的,尤其当表里面出现过delete动作以后,逻辑导出再导入另外一个表后,两个表的全表扫描结果可能不同。
Checksum table计算返回值的逻辑大致如下:
ha_checksum crc= 0; foreach(row in table) { row_crc= get_crc(row); crc+= row_crc; } return crc;
可以看到只要总行数已经行内容相同,与读取行的顺序无关。
从这个逻辑还能得到一下几个结论:
1) 与使用的引擎无关,也就是说即使主备不用同一个引擎,checksum也可用于检查。虽然InnoDB有隐藏行,但这里无视。
2) 与是否有索引无关。row_crc只用行本身的数据来计算,并不包括索引数据。
也就是说如果能够保证两个表里面的数据一样,表结构(列内容和顺序一样),操作系统一样,MySQL版本一致,是能够保证checksum的结果的。
下面我们讨论集中“不一样”
字段顺序不同是否有影响
在个row计算row_crc时,是每个字段依次计算的。但计算过程中会将上一个字段的结果作为计算下一个值的输入。
switch (f->type()) { case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_BIT: { String tmp; f->val_str(&tmp); row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(), tmp.length()); break; } default: row_crc= my_checksum(row_crc, f->ptr, f->pack_length()); break; } |
因此字段顺序会影响结果。
字段长度不同是否有影响
即使看到相同的内容,也有可能得到不同的checksum。
从上面计算每个field的crc上看,若为变长字段(varchar等),由于用于计算的是实际长度,因此不会影响。比如将表的varchar(20)字段改成varchar(25),不会改变checksum的值。
但若将char(20)改成char(25),或者int改成bigint,则会改变checksum。
操作系统位数不同
因为返回值是unsigned long,我们就担心32位和64位机器的溢出问题。所幸在计算过程中的ha_myisam直接定义为uint32,只是在返回的时候才转成unsigned long,因此无影响。
字符集不同
这个问题其实一直比较含糊。实际上与输入字符集有关。但有一个结论是肯定的:若表里面字段的unhex()值相同,得到的checksum即相同。
相关推荐
MD5_and_SHA_Checksum_Utility
MD5_and_SHA_Checksum_Utility,文件hash计算,小巧绿色速度快
windows中checksum校验算法:求解网络报文中的checksum
计算十六进制的CheckSum
IP TCP UDP checksum计算c代码,包含checdsum原理说明,以及实现c代码,用于验证网络平时收发包checksum问题
checksum offload理解
使用C#开发文件校验和工具,计算烧录文件的内容的文件的校验和CheckSum。
将十六进制字符串中的数(长度不限)累加求和,取累加和最低一个字节,生成CheckSum校验码。例如十六进制字符串:01 03 00 10 00 4D 31 30 30 20 32 36 64 42 6D 20 56 31 2E 30,生成CheckSum校验码为92(十六进制)...
checksum校验和计算工具,16进制校验和计算工具,简单实用。
效验和(checksum) 原理:把要发送的数据看成二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的0以凑成偶数。 为了计算效验和,发送计算机把每对字符当成16位整数处理并计算效验...
NXP使用处理器向量表的一个word存储校验和(checksum),引导程序审查该校验和以确定是否是有效程序。对于ARM7/ARM9,这个校验字存储在偏移0x14的地址上,而Cortex-M存储在偏移0x1C的地址上。由于GNU ARM产生的二进制...
Linux C语言实现的计算文件夹的checksum功能
udp tcp checksum
checksum工具软件,对每个文件checksum有一个四位的十六进制代码,防止文件重复,便于区分
该模块对数据的头不进行直接存储,放到寄存器里,在IRAM中读入数据部分,计算tcp的checksum,然后再将整帧数据存入到ORAM中
小巧玲珑的ESN Checksum计算,VB编写的,编译后只有41K
checksum C语言 源代码 改编 ,checksum C语言 源代码 改编,checksum C语言 源代码 改编
能够实现labVIEW 计算校验和 并能够检验校验和是否正确
Flash_Tool刷机时报错CheckSum。把CheckSum.exe文件放在跟CheckSum.ini一个目录,运行后更新CheckSum.ini,不再报错。
checksum工具,适用于mtk平台l/m 拷贝到out下img生成目录运行即可