Skip to content
forked from foxglove/crc

Fast CRC32 computation in TypeScript

License

Notifications You must be signed in to change notification settings

Lichtblick-Suite/crc

 
 

Repository files navigation

@lichtblick/crc

Fast CRC32 computation in TypeScript

npm version

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 (/* more data available */) {
  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

  1. Run yarn version --[major|minor|patch] to bump version
  2. Run git push && git push --tags to push new tag
  3. GitHub Actions will take care of the rest

About

Fast CRC32 computation in TypeScript

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • TypeScript 99.4%
  • JavaScript 0.6%