polycrc
Version:
Fast Javascript calculation of custom CRC checksum. Prebuilt models for CRC-6, CRC-8, CRC-10, CRC-16, CRC-24, CRC-32, CRC-32C.
166 lines (122 loc) • 6.15 kB
Markdown
This module provides fast calculation of CRC ([Cyclic redundancy check][Wiki])
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
```js
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
```js
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
algorithm 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
algorithm 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
[wiki]: https://en.wikipedia.org/wiki/Cyclic_redundancy_check
## Author
Copyright (c) 2018 Vladimir Latyshev
License: MIT