Skip to main content

Python module for SIMD-accelerated CRC32 checksum computation

Project description

pycrc32

PyPI - Version PyPI - Python Version PyPI - License PyPI - Downloads

pycrc32 is a Python module for SIMD-accelerated CRC32 checksum computation.
Big thanks to rust-crc32fast - this project just provides Python bindings for their Rust implementation.

Installation

pip install pycrc32

Usage

from pycrc32 import crc32

data = b"123456789"
print(f"crc32 for {data!r} is {crc32(data)}")

Advanced Checksum Calculation with Hasher

For scenarios that require more flexibility, such as processing large amounts of data or computing the checksum in stages, you can use the Hasher class:

from pycrc32 import Hasher

# Create a new Hasher instance
hasher = Hasher()

# Update the hasher with data chunks
hasher.update(b"123456")
hasher.update(b"789")

# Finalize the computation and get the checksum
checksum = hasher.finalize()
print(f"Checksum: {checksum}")

# Reset the hasher to compute another checksum
hasher.reset()
hasher.update(b"The quick brown fox jumps over the lazy dog")
new_checksum = hasher.finalize()
print(f"New checksum: {new_checksum}")

You can also initialize a Hasher with a specific initial CRC32 state:

initial_crc = 12345678
hasher = Hasher.with_initial(initial_crc)

hasher.update(b"additional data")
final_checksum = hasher.finalize()
print(f"Final checksum with initial state: {final_checksum}")

To combine checksums from different data blocks without needing to concatenate the data, use the combine method:

hasher1 = Hasher()
hasher1.update(b"Data block 1")
checksum1 = hasher1.finalize()

hasher2 = Hasher()
hasher2.update(b"Data block 2")
checksum2 = hasher2.finalize()

# Combine checksums from hasher1 into hasher2
hasher1.combine(hasher2)  # Combine the state of hasher2 into hasher1

# The final checksum after combination
combined_checksum = hasher1.finalize()
print(f"Combined checksum: {combined_checksum}")

Speed

The performance of pycrc32 has been benchmarked on a trusty old Intel i7-8550U using 32MB of random input data. Below is a comparison of the median computation times across different libraries:

Library Median Time (s)
pycrc32 0.002703
zlib 0.019796
fastcrc 0.071426

We reach almost 10x performance improvements compared to the zlib baseline implementation.
See scripts/bench.py for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pycrc32-0.2.0.tar.gz (8.2 kB view hashes)

Uploaded Source

Built Distributions

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

pycrc32-0.2.0-cp312-none-win_amd64.whl (150.2 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

pycrc32-0.2.0-cp312-none-win32.whl (146.5 kB view hashes)

Uploaded CPython 3.12 Windows x86

pycrc32-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.5+ i686

pycrc32-0.2.0-cp312-cp312-macosx_11_0_arm64.whl (262.0 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

pycrc32-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl (267.7 kB view hashes)

Uploaded CPython 3.12 macOS 10.12+ x86-64

pycrc32-0.2.0-cp311-none-win_amd64.whl (149.6 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

pycrc32-0.2.0-cp311-none-win32.whl (146.6 kB view hashes)

Uploaded CPython 3.11 Windows x86

pycrc32-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.5+ i686

pycrc32-0.2.0-cp311-cp311-macosx_11_0_arm64.whl (261.5 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

pycrc32-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl (267.6 kB view hashes)

Uploaded CPython 3.11 macOS 10.12+ x86-64

pycrc32-0.2.0-cp310-none-win_amd64.whl (149.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

pycrc32-0.2.0-cp310-none-win32.whl (146.6 kB view hashes)

Uploaded CPython 3.10 Windows x86

pycrc32-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.5+ i686

pycrc32-0.2.0-cp310-cp310-macosx_11_0_arm64.whl (261.5 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

pycrc32-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl (267.5 kB view hashes)

Uploaded CPython 3.10 macOS 10.12+ x86-64

pycrc32-0.2.0-cp39-none-win_amd64.whl (149.9 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

pycrc32-0.2.0-cp39-none-win32.whl (146.6 kB view hashes)

Uploaded CPython 3.9 Windows x86

pycrc32-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.5+ i686

pycrc32-0.2.0-cp38-none-win_amd64.whl (150.1 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

pycrc32-0.2.0-cp38-none-win32.whl (146.5 kB view hashes)

Uploaded CPython 3.8 Windows x86

pycrc32-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.0 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

pycrc32-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.2 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

pycrc32-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.1 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

pycrc32-0.2.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.0 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARMv7l

pycrc32-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.0 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

pycrc32-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl (1.1 MB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.5+ i686

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page