@lichtblick/crc
Fast CRC32 computation in TypeScript
Introduction
A Cyclic Redundancy Check (CRC) is a calculation used to detect errors in data transmission.
This library implements CRC32, the standard 32-bit CRC using the binary polynomial 0xEDB88320
. This is the same algorithm used in PNG, zlib, and other popular applications.
Interface
The following functions are exported from this package:
function crc32Init(): number;
function crc32Update(prev: number, data: ArrayBufferView): number;
function crc32Final(prev: number): number;
function crc32(data: ArrayBufferView): number;
Note: Since the CRC algorithm works with unsigned data, the crc32
and crc32Final
functions always return non-negative numbers. For example, CRC32(0x01) returns 2768625435 rather than -1526341861.
Usage
import { crc32 } from "@lichtblick/crc";
const data = new Uint8Array(...);
const crc = crc32(data);
import { crc32Init, crc32Update, crc32Final } from "@lichtblick/crc";
let crc = crc32Init();
while () {
crc = crc32Update(crc, data);
}
crc = crc32Final(crc);
Benchmarks
This package achieves a >5x performance improvement over many other CRC packages, because of the multi-byte algorithms used (adapted from https://github.com/komrad36/CRC).
The following benchmarks were recorded on a MacBook Pro with an M1 Pro chip and 16GB of RAM. Each iteration ("op") is processing 1MB of data.
$ yarn bench
...
crc:
355 ops/s, ±0.56% | 81.52% slower
node-crc:
376 ops/s, ±0.14% | 80.43% slower
crc-32:
1 057 ops/s, ±0.16% | 44.98% slower
polycrc:
327 ops/s, ±0.21% | slowest, 82.98% slower
this package:
1 921 ops/s, ±0.18% | fastest
References
For further information about CRCs and their computation, see:
License
@lichtblick/crc is licensed under the MIT License.
Releasing
- Run
yarn version --[major|minor|patch]
to bump version - Run
git push && git push --tags
to push new tag - GitHub Actions will take care of the rest