polycrc

Fast Javascript calculation of custom CRC checksum. Prebuilt models for CRC-6, CRC-8, CRC-10, CRC-16, CRC-24, CRC-32, CRC-32C.

Usage no npm install needed!

<script type="module">
  import polycrc from 'https://cdn.skypack.dev/polycrc';
</script>

README

This module provides fast calculation of CRC (Cyclic redundancy check) with custom parameters:

  • width - any number 1 ... 32
  • polynom
  • XOR in
  • XOR out
  • reflect

Calculation is table-based. Tables are dynamically generated once per CRC model. There are prebuilt models for CRC-6, CRC-8, CRC-10, CRC-16, CRC-24, CRC-32, CRC-32C.

Motivation for this module were checksums (CRC-6 and CRC-10) used in IuUP (3GPP TS 25.415). It seems to be no other universal and fast CRC module in npm registry.

CRC mathematics are mostly ported from https://pycrc.org/

Installation

npm install polycrc

API

Where available, this library supports:

  • Standard ECMAScript TypedArrays, DataView, ArrayBuffer
  • Legacy Node.js Buffers

crc6(buffer)

crc8(buffer)

crc10(buffer)

crc16(buffer)

crc24(buffer)

crc32(buffer)

crc32c(buffer)

Calculates checksum. Returns number.

crc(width, poly, xor_in, xor_out, reflect)

Generates new CRC function with custom parameters. Returns function.

new CRC(width, poly, xor_in, xor_out, reflect)

Generates new CRC model with custom parameters. Returns class. Mostly for internal purposes.

For creating new CRC checksum functions use generator function crc().

models

module.exports.models object holds prebuilt classes, which can be used for pretty-printing generated CRC tables:

console.log(polycrc.models.crc8.print_table())

Example

let crypto = require('crypto')
let polycrc = require('polycrc')
let crc10 = polycrc.crc10
let result = crc10(crypto.randomBytes(1024))
console.log(result)
let crc5 = polycrc.crc(5, 0x5, 0x1f, 0x1f, true)
console.log(crc5('Input is usually a buffer, but string is ok'))
console.log(polycrc.models.crc8.print_table())

Prebuilt models

const models = {
  crc1: new CRC(1, 0x01, 0x00, 0x00, false),
  crc6: new CRC(6, 0x2F, 0x00, 0x00, false),
  crc8: new CRC(8, 0x07, 0x00, 0x00, false),
  crc10: new CRC(10, 0x233, 0x0000, 0x0000, false),
  crc16: new CRC(16, 0x8005, 0x0000, 0x0000, true),
  crc24: new CRC(24, 0x864CFB, 0xB704CE, 0x000000, false),
  crc32: new CRC(32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true),
  crc32c: new CRC(32, 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true)
}

Module comparison

Here are benchmarks for several npm modules, compared to polycrc. Benchmarking tool located in examples dir.

Binary modules marked *

100 Mb of data in 300 byte chunks

   algorythm           module            value         calc/sec

        crc1          polycrc                1           742093
        crc1              crc              172          1588754

        crc6          polycrc                8           776724

        crc8          polycrc              115          1398104
        crc8              crc              115          1065628
        crc8       node-crc *              115           452168

       crc10          polycrc              451           771580

       crc16          polycrc            18086           960236
       crc16              crc            18086          1046485
       crc16       node-crc *            18086           484779

       crc24          polycrc          3554611           775002
       crc24              crc          3554611           604716

       crc32          polycrc       1459514028           976329
       crc32              crc       1459514028          1149756
       crc32       node-crc *       1459514028           466034

       crc32          polycrc       1459514028           970905
       crc32              crc       1459514028          1165086
       crc32         node-crc       1459514028           458094
       crc32           crc-32       1459514028          1127503
       crc32     buffer-crc32       1459514028           992971
       crc32        cyclic-32       1459514028          1157370

      crc32c          polycrc       4240566998           865163
      crc32c  fast-crc32c(js)       4240566998          1019026
      crc32c    fast-crc32c *       4240566998          2818758
      crc32c     sse4_crc32 *       4240566998          2410524

100 Mb of data in 100 kb chunks

   algorythm           module            value         calc/sec

        crc1          polycrc                0             1572
        crc1              crc              193             5919

        crc6          polycrc               33             1651

        crc8          polycrc               27             4231
        crc8              crc               27             3250
        crc8       node-crc *               27             3683

       crc10          polycrc              119             1670

       crc16          polycrc            17776             2976
       crc16              crc            17776             3240
       crc16       node-crc *            17776             3592

       crc24          polycrc         14484065             2438
       crc24              crc         14484065             1738

       crc32          polycrc         61412246             2942
       crc32              crc         61412246             3518
       crc32       node-crc *         61412246             3567

       crc32          polycrc         61412246             2934
       crc32              crc         61412246             3592
       crc32         node-crc         61412246             3631
       crc32           crc-32         61412246             3580
       crc32     buffer-crc32         61412246             3555
       crc32        cyclic-32         61412246             3567

      crc32c          polycrc        587481699             3011
      crc32c  fast-crc32c(js)        587481699             3240
      crc32c    fast-crc32c *        587481699            53894
      crc32c     sse4_crc32 *        587481699            56888

Author

Copyright (c) 2018 Vladimir Latyshev

License: MIT