Skip to content

marzooqy/anycrc

Repository files navigation

Fast CRC for Python. Supports calculating CRC hashes of arbitary sizes as well as updating a CRC hash over time.

Installation

pip install anycrc

Usage

Use an existing model:

>>> import anycrc
>>> crc32 = anycrc.Model('CRC32-MPEG-2')
>>> crc32.calc(b'Hello World!')
2498069329

Create a CRC with specific parameters:

>>> crc32 = anycrc.CRC(width=32, poly=0x04c11db7, init=0xffffffff, refin=False, refout=False, xorout=0x00000000)
>>> crc32.calc('Hello World!')
2498069329

Read the data in chunks:

>>> value = crc32.calc(b'Hello ')
>>> crc32.calc(b'World!', value)
2498069329

The length of the data can be specified in bits by calling calc_bits and passing a bitarray object:

>>> from bitarray import bitarray
>>> bits = bitarray()
>>> bits.frombytes(b'Hello World!')
>>> value = crc32.calc_bits(bits[:50])
>>> crc32.calc_bits(bits[50:], value)
2498069329

To use bit lengths with reflected CRCs, create a little endian bitarray object: bitarray(endian='little')

To combine two CRCs, provide the CRC values along with the length of the second CRC's message in bytes:

>>> value = crc32.calc(b'Hello ')
>>> value2 = crc32.calc(b'World!')
>>> crc32.combine(value, value2, len(b'World!'))
2498069329

There is also a combine_bits method where the length argument is expected to be in bits.

For a list of pre-built models, check models.py. To get a list of the models at any time, use the following command:

python -m anycrc models

The maximum supported CRC width is 64 bits.

Benchmark

Module Speed
anycrc 26.65 GiB/s
crcmod-plus 628.00 MiB/s
fastcrc 552.12 MiB/s
libscrc 198.88 MiB/s
crcengine 9.92 MiB/s
pycrc 8.15 MiB/s
crccheck 1.30 MiB/s
crc 0.45 MiB/s

Tested on a 12th generation Intel i7 processor.

About

The fastest general Python CRC library

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors