优化变种CRC算法

栏目: 编程工具 · 发布时间: 6年前

内容简介:关于该算法的优化也经常是大家关心的一个方向,现在最常用的实现基本都是查表法,下图是别人总结的相关算法的优化历史:

CRC算法

循环冗余校验-CRC 是常用的一种校验数据一致性的算法。关于其原理与发展可以参考其维基百科。

关于该算法的优化也经常是大家关心的一个方向,现在最常用的实现基本都是查表法,下图是别人总结的相关算法的优化历史:

优化变种CRC算法

可以看出,当因特尔提出了 slice-by-x 的优化后,其速度得到的飞跃。

然而CRC算法的变种数量非常之多,但是已经被实现的那些优化只是少数的几种,比如 ISOECMA 等。同时这些优化后的代码已经丢失的大量中间过程,是的其难以被移植到其他变种之上。

优化变种算法

经过一番研究考证,CRC64变种采用 slice-by-x 优化的主要步骤为:

  • 将原始查询表转化为8重表格
    // table[0] 是原始查询表, table[1...7] 是生成的8重表格
    for (n = 0; n < 256; n++) {
      crc = table[0][n];
    
      for (k = 1; k < 8; k++) {
          crc = table[0][crc & 0xff] ^ (crc >> 8);
          table[k][n] = crc;
      }
    }
  • 优化CRC算法,每个循环计算8个字节
    while (len >= 8) {
      crc ^= *(uint64_t *)byte; // 小端计算方式
      crc = table[7][crc & 0xff] ^
            table[6][(crc >> 8) & 0xff] ^
            table[5][(crc >> 16) & 0xff] ^
            table[4][(crc >> 24) & 0xff] ^
            table[3][(crc >> 32) & 0xff] ^
            table[2][(crc >> 40) & 0xff] ^
            table[1][(crc >> 48) & 0xff] ^
            table[0][crc >> 56];
      byte += 8;
      len -= 8;
    }
    while (len) {
      crc = table[0][(crc ^ *byte++) & 0xff] ^ (crc >> 8);
      len--;

实现

github.com/lrita/crc64 采用上述方法,优化了 redis 使用的 CRC64 变种算法,使其速度从 381.29 MB/s 提升到 1474.16 MB/s .

参考


以上所述就是小编给大家介绍的《优化变种CRC算法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web应用漏洞侦测与防御

Web应用漏洞侦测与防御

Mike Shema / 齐宁、庞建民、张铮、单征 / 机械工业出版社 / 2014-8-20 / 69.00

本书由国际知名网络安全专家亲笔撰写,全面讲解如何预防常见的网络攻击,包括HTML注入及跨站脚本攻击、跨站请求伪造攻击、SQL注入攻击及数据存储操纵、攻破身份认证模式、利用设计缺陷、利用平台弱点、攻击浏览器和隐私等, 全书共8章:第1章介绍HTML5的新增特性及使用和滥用HTML5的安全考虑;第2章展示了如何只通过浏览器和最基本的HTML知识就可以利用Web中最常见的漏洞;第3章详细讲解CSR......一起来看看 《Web应用漏洞侦测与防御》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具