一种数据一致性校验的方法

发表于2016-10-29
评论0 4.5k浏览
        目前使用数据复制的时候,对数据完整性校验方面的保护措施还没有,不能判断网络传输过程中被恶意串改,异构数据复制过程中,没有验证数据完整性的保护措施。
       如果可以把一行数据计算出一个唯一值,在数据行末尾增加一个字段用来存储这个唯一值,当数据变更的时候同时更新这个唯一值;在使用这个数据的时候,如果需要验证数据是否完整,可以根据这个唯一值来校验。

完整技术方案
       收到新增数据请求,使用CRC32算法计算新增数据,获得一个32位的无符号整形数据,这个32位的无符号整形数据我们称之为校验KEY,将校验KEY,附加到新增数据末位的隐含列。
insert:


       例如向数据库新增一行数据:INSERT INTO user(id, name, age) VALUES(1, ‘shell’, 28);
       使用CRC32算法对新数据生成一个校验KEY:2986321190
       设置的隐含列为:_key int unsigned not null
       拦截到这条SQL语句,将之重写为:INSERT INTO user(id, name, age, _key) VALUES(1, ‘shell’, 28, 2986321190);
       收到数据变更的请求,同样使用CRC32算法计算新增数据,获得校验KEY,将校验KEY更新到隐含列。
 


       例如向数据库更新一行数据:UPDATE user set name = ‘kate’ WHERE id = 1;
       首先获得原数据行数据,1,[], 28
       将新数据kate填充到[], 1kate28
       计算出新的CRC32:975831571
       将SQL语句改写为:UPDATE user set name = ‘kate’, _key =  975831571 WHERE id = 1;

效果:
       在把数据从一个地方复制到另一个地方的时候,例如将数据从A复制到B,原来的方案需要把A和B查询出来做比较;用了校验KEY,只需要在B用校验KEY来验证数据是否复制完整。

关键点:
       1、使用CRC32算法生产的附加列只占用4个字节的额外存储空间。
       2、附加列是对生产不可感知的,只用作后台数据流复制时,校验数据用。
 看了上面的文章 热爱游戏创作的你是不是已经开始热血沸腾了呢?是不是迫不及待的想加入游戏团队成为里面的一员呢?
  福利来啦~赶快加入腾讯GAD交流群,人满封群!每天分享游戏开发内部干货、教学视频、福利活动、和有相同梦想的人在一起,更有腾讯游戏专家手把手教你做游戏!
腾讯GAD游戏程序交流群:484290331

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引