1.CRC16校验算法源码(易语言)
2.PostgreSQL 校验和
3.async-validator源码解析(二):rule
CRC16校验算法源码(易语言)
CRC校验算法源码在易语言中的和校实现如下:
版本 2
子程序 _CRC校验计算, 参数 预校验内容, 预校验内容为字节型数组
局部变量 crc, 用于存储校验值,初始值为 "2"
局部变量 返回数据,验源 用于存储最终的校验值,类型为整数型
局部变量 j,码和 用于数组索引,类型为整数型
局部变量 被校验内容,校验 用于存储数组中的每个字节,类型为字节型
局部变量 i,代码 用于循环计数,类型为整数型
局部变量 CY,和校海洋muD源码 用于判断当前位是否为1,类型为整数型
局部变量 crc高位,验源 用于存储高位校验值,类型为文本型
局部变量 crc低位,码和 用于存储低位校验值,类型为文本型
初始化crc为 { ,校验 }
计次循环首 (取数组成员数 (预校验内容), j)
被校验内容 = 预校验内容 [j]
crc [2] = 位异或 (被校验内容, crc [2])
计次循环首 (8, i)
CY = 位与 (crc [2], 1) ' 检查CRC[2]与1有没有共同位
如果 (CY = 1) ' 如果CRC[2]与1有共同位
crc [2] = 右移 (crc [2], 1) ' 低位右移一位
如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位
crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1
如果真结束
crc [1] = 右移 (crc [1], 1) ' crc高位右移一位
crc [2] = 位异或 (crc [2], 1) ' CRC低位与生成多项式0XA求异或
crc [1] = 位异或 (crc [1], ) ' CRC高位与生成多项式0XA求异或
否则
crc [2] = 右移 (crc [2], 1) ' 低为右移一位
如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位
crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1
如果真结束
crc [1] = 右移 (crc [1], 1) ' 高位右移1位
否则结束
计次循环尾 ()
计次循环尾 ()
如果真 (取文本长度 (到文本 (crc [1])) = 1)
crc高位 = “” + 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [1])) = 2)
crc高位 = “0” + 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [1])) = 3)
crc高位 = 到文本 (crc [1])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 1)
crc低位 = “” + 到文本 (crc [2])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 2)
crc低位 = “0” + 到文本 (crc [2])
如果真结束
如果真 (取文本长度 (到文本 (crc [2])) = 3)
crc低位 = 到文本 (crc [2])
如果真结束
返回 (crc高位 + crc低位)
PostgreSQL 校验和
在计算机系统中,校验和(checksum)用于检测数据在传输或存取过程中是代码否发生错误。PostgreSQL自9.3版本起支持校验和功能,和校旨在检测由磁盘或I/O系统导致的验源数据可用性问题。本文将详细介绍PostgreSQL中校验和的码和使用方法及其工作原理。
PostgreSQL通过在数据页上启用校验和功能,校验可以检测到由I/O系统引发的代码网站实例源码潜在数据损坏问题。用户可以通过在初始化时使用-k或--data-checksums参数开启此功能。然而,开启校验和可能导致性能下降,因此仅在初始化阶段设置,无法在运行时更改。一旦启用,校验和将应用于所有数据库中的所有对象。
校验和功能引入了一个名为ignore_checksum_failure的GUC参数,用于控制在校验和失败时的处理方式。如果设置为true,校验和失败不会产生错误,而是向客户端发送警告。然而,校验和失败表明磁盘上的菜单目录源码数据已损坏,忽略此类错误可能导致数据损坏的扩散,甚至导致系统崩溃。因此,如果启用校验和,建议将ignore_checksum_failure参数设置为false。
在PostgreSQL中,校验和在从缓冲池刷入存储时设置。当数据页再次从存储读取到缓冲池时,会进行校验。在FlushBuffer过程中,通过复制数据页内容并计算校验和以确保数据页内容与校验和保持一致。如果存在其他进程在只加缓冲池共享锁的情况下并发修改数据页中的内容(如指示位),可能导致校验和值在刷盘过程中发生变化。为确保数据页内容与其校验和的fastjson 源码解析一致性,PostgreSQL采用先复制页,然后计算并设置校验和值的方法。
校验和算法基于FNV-1a hash算法改造而来,结果为位无符号整型。PageHeaderData中的pd_checksum字段用于存储位无符号整型校验和值。pg_checksum_block函数计算数据页的位校验和值,具体算法在源码中详细实现。
当数据页从存储读入内存时,PostgreSQL会检测其可用性。检测不仅针对非零页(正常初始化的页),还针对全零页(所有内容均为零的页)。全零页的出现通常是在特定场景下,例如表中某个进程在扩展表时添加了新页,但在WAL日志写入存储之前,编译pix源码进程崩溃。重启时会读取到该全零页。
对于非零页,检测其校验和是否一致以及页头信息是否正确。若校验和失败但页头信息正确,根据ignore_checksum_failure值判断验证是否通过;对于全零页,如果为全零,则验证通过。若验证失败,则有两种处理方式:记录日志或不记录日志,具体取决于忽略校验和失败情况下的处理策略。
在数据页写入存储时,如果写入失败,可能导致数据页的部分损坏,即数据页的一部分数据写入成功,一部分数据写入失败。为解决此类问题,PostgreSQL引入了full_page_writes特性。此外,Hint Bits通常用于标识事务状态,但当使用校验和时,其变化可能导致校验和值改变。如果数据页发生部分写操作,恰好修改了某些Hint Bits,可能会导致校验和异常,但不影响数据页的正常使用。为应对这种情况,checkpoint后页面第一次标记为dirty时,需要记录一个全页快照至WAL日志中,以应对因Hint Bits更新导致的校验和失败问题。
为了查看数据页的校验和,PostgreSQL 在pageinspect插件中添加了函数page_checksum()。此外,使用page_header()函数也可以查看校验和值。
总结来说,校验和功能使PostgreSQL具备检测因硬件故障或传输导致的数据不一致的能力。一旦检测到异常,通常会终止当前事务,以便用户尽早察觉数据异常并进行恢复。尽管开启校验和会引入一定开销,但对于数据可用性要求较高的场景,建议同时开启full_page_writes和校验和功能。这样可以在避免数据丢失的同时,尽早发现并记录WAL日志中的全页快照,以应对数据损坏问题。
async-validator源码解析(二):rule
async-validator源码解析(二)深入探讨rule模块,解析其内部的校验逻辑和依赖工具函数。本文将逐步揭开rule目录的面纱,以及util.js中关键的format和isEmptyValue方法。
rule目录的核心是export的一系列校验方法,它们接受value、source、errors和options作为参数。value是当前字段的值,source是整个待校验的对象,而errors数组用于存储验证结果。options允许自定义验证消息。每种规则方法如required、whitespace、range等,都有特定的验证功能,例如检查必填性、空白字符、数值范围等。
format函数是个灵活的工具,根据传入参数的不同执行不同的格式化操作。而isEmptyValue则用于判断值是否为空,包括空字符串和空数组。
在rule目录中,type.js规则尤其有趣,通过组合简单的判断,区分了值的多种类型,如整数、浮点数、数组等。
后续文章将继续关注validator目录,完整揭示async-validator校验库的运作机制。点击github.com/MageeLin/asy.../analysis分支,探索每个文件的详细代码解析。