整理SQL SERVER数据页checksum校验算法
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,在SQL SERVER2005以上版本中,数据页默认开启checksum,标识为m_flagBits & 0x200 == True,其值m_tornBits位于页头0x3C,4字节。其算法概述如下:
千家信息网最后更新 2026年11月02日整理SQL SERVER数据页checksum校验算法
在SQL SERVER2005以上版本中,数据页默认开启checksum,标识为m_flagBits & 0x200 == True,其值m_tornBits位于页头0x3C,4字节。
其算法概述如下:
读8KB 进BUF将BUF头部 CHECKSUM的4字节值清0uint32 checksum = 0 //初始checksumfor 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源码如下:
//***CODE***//#include#include #define seed 15 //Initial seed(for first sector)#define CHAR_BIT 8 //***PROTOTYPES***//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 //***PRINTS***// printf("Calculated checksum: 0xx\n", computed_checksum); printf("On disk checksum: 0xx\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);}
字节
数据
算法
最低
头部
方法
标识
源码
版本
j++
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国互联网科技工作委员会毛军
疫情对互联网科技公司影响
金融科技还是互联网
喔噻互联网科技
智慧科技互联网
天津摩尔互联网科技
互联网科技公司名称
互联网科技股有哪些
新华互联网科技校企合作
恒生科技互联网指数分析
博兴的互联网电子科技公司
互联网之后的科技是什么
新华互联网科技2019
彤创互联网科技有限公司
四川互联网展示科技馆设计
卡尔迅互联网科技有限公司
江苏互联网智能科技产品出厂价
科技互联网经济论坛
平安好医生打造互联网科技医疗
互联网科技创新方面的资料
美国互联网黑科技
广西互联网科技公司
青岛科技大学互联网大赛研究生
互联网科技公司有风险吗
中国互联网十大科技股排名
长沙茂晟互联网科技有限公司
华中科技大学互联网的牛人
艺电能源互联网科技有限公司招聘
平安好医生打造互联网科技医疗
恒生互联网科技趋势