文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL SERVER数据页checksum校验算法

2024-04-02 19:55

关注

在SQL SERVER2005以上版本中,数据页默认开启checksum,标识为m_flagBits & 0x200 == True,其值m_tornBits位于页头0x3C,4字节。
其算法概述如下:

读8KB 进BUF
将BUF头部 CHECKSUM的4字节值清0
uint32 checksum = 0 //初始checksum
for i in range(0,15):
         //每扇区的初始checksum
         overall = 0;
        for ii in range(0,127):
                 //对当前扇区的每个4字节做累加异或
                overall = overall ^ BUF[i][ii];
                //对每扇区的checksum进行移位,方法为向左移位15-i位,
                //左边移出的15-i位补到最低位。
                checksum = checksum ^ rol(overall, 15- i); 
return checksum; //Gets checksum

c源码如下:

//
#include <stdio.h>
#include <stdlib.h>

#define seed 15 //Initial seed(for first sector)
#define CHAR_BIT 8 

//
unsigned int page_checksum(int page_id, unsigned int *ondisk);
unsigned int rol(unsigned int value, unsigned int rotation);

int main(int argc, char *argv[]) {

    unsigned int computed_checksum; //Var to retrieve calculated checksum
    unsigned int ondisk_checksum; //Var to retrieve checksum on disk

        computed_checksum = page_checksum(152, &ondisk_checksum); //page_checksum call to retrieve stored and calculated checksum for page 152

        //
        printf("Calculated checksum: 0x%08x\n", computed_checksum);
        printf("On disk checksum: 0x%08x\n", ondisk_checksum);

}

unsigned int page_checksum(int page_id, unsigned int *ondisk)
{

    FILE *fileptr; 
    unsigned int i; 
    unsigned int j;
    unsigned int checksum;
    unsigned int overall;
    unsigned int *pagebuf[16][128]; //A pointer to describe 2d array [sector][element]

    fileptr = fopen("C:\\Users\\andre\\Desktop\\teste.mdf", "r+b"); //Open dummy data file for binary read

    fseek(fileptr, page_id * 8192, SEEK_SET); //Calculate page address on data file and points to it

    fread(pagebuf, 4, 2048, fileptr); //Read page buffer

    fclose(fileptr);

    checksum = 0;
    overall = 0;

    *ondisk = pagebuf[0][15]; //This means that torn bits is stored on first sector in 15th element, Internals researches understand this

    pagebuf[0][15] = 0x00000000; //Fill checksum field with zeroes (this field will be discarded in algorithm)

    for (i = 0; i < 16; i++) //Loop through sectors
    {

        overall = 0; //Reset overall sum for sectors

        for (j = 0; j < 128; j++) //Loop through elements in sector i
        {
            overall = overall ^ (unsigned int)pagebuf[i][j]; //XOR operation between sector i elements
        }

        checksum = checksum ^ rol(overall, seed - i); //Current checksum is overall for sector i circular shifted by seed (15 - i)
    }

    return checksum; //Gets checksum

}

unsigned int rol(unsigned int value, unsigned int rotation)
{
    return (value) << (rotation) | (value) >> (sizeof(int) * CHAR_BIT - rotation) & ( (1 << rotation) -1);
}
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯