【leveldb源码】数据结构之crc校验

源码中写在util文件夹下,crc校验主要问了校验SSTable中block内容的完整性,头文件crc32c.h中定义了mask、unmask、value三个方法,mask方法源码中的解释是 it is problematic to compute the CRC of a string that contains embedded CRCs. Therefore we recommend that CRCs stored somewhere (e.g., in files) should be masked before being stored. 翻译一下就是计算一个包含crc校验码的字符串的crc值是有问题的,因此在crc被保存之前就应该被处理一下,虽然没太明白什么意思,但是应该可以理解为加密crc?反正我照抄了。value方法返回字符串的crc值。具体的实现在extend中。
在这里插入图片描述
源码在计算crc32时,首先判断cpu有没有计算能力,如果有就用cpu自己的能力计算CRC32,如果没有,采用查表法来计算crc32,网上很多关于crc原理的介绍,总的说来就是用字符串的二进制的末尾先补零,除以用二进制表示的多项式,除后的余数就是crc码,填在原二进制的末尾即可。除多项式可以用异或算法代替,后面发现异或算法也是有规律的,为了提高效率就有了查表法。源码为了提高效率,16位为一个处理单位。
java也实现了CRC32,java.util.zip.CRC32C,也是用的查表法,不过没有直接给出表,而是在静态代码块中初始化了表。
一个很厉害的java版实现

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/108683360