我想知道 SQLite WAL 模式下的校验和算法我已经检查了 doc 文件,但它是这样说的(这张图片是在 sqlite doc 文件https://www.sqlite.org/fileformat2.html#section_4_1中捕获的)
我不明白“帧头的最后 8 个字节中的校验和值与 WAL 头的前 24 个字节和前 8 个字节以及所有帧的内容连续计算的校验和完全匹配是什么意思直到并包括当前帧“
我想更清楚地了解。
谢谢。
我想知道 SQLite WAL 模式下的校验和算法我已经检查了 doc 文件,但它是这样说的(这张图片是在 sqlite doc 文件https://www.sqlite.org/fileformat2.html#section_4_1中捕获的)
我不明白“帧头的最后 8 个字节中的校验和值与 WAL 头的前 24 个字节和前 8 个字节以及所有帧的内容连续计算的校验和完全匹配是什么意思直到并包括当前帧“
我想更清楚地了解。
谢谢。
文档的下一部分说:
校验和算法
通过将输入解释为偶数个无符号 32 位整数来计算校验和:
x(0)
通过x(N)
. 如果 WAL 头的前 4 个字节中的幻数是 32 位整数是大端的,如果幻数是0x377f0683
,则整数是小端的0x377f0682
。无论使用哪种字节顺序来计算校验和,校验和值始终以大端格式存储在帧头中。校验和算法仅适用于长度为 8 字节的倍数的内容。换句话说,如果输入
x(0)
通过,x(N)
那么 N 一定是奇数。校验和算法如下:s0 = s1 = 0 for i from 0 to n-1 step 2: s0 += x(i) + s1; s1 += x(i+1) + s0; endfor # result in s0 and s1
输出
s0
和s1
都是使用逆序斐波那契权重的加权校验和。(最大的斐波那契权重出现在被求和的序列的第一个元素上。)该s1
值跨越序列的所有 32 位整数项,而s0
忽略最后一项。