diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index da3e2be9b2..8488e38d4d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,8 @@ repos: # Package dependencies - packaging - donfig - - numcodecs[crc32c] + - numcodecs + - google-crc32c>=1.5 - numpy==2.1 # until https://github.com/numpy/numpy/issues/28034 is resolved - typing_extensions - universal-pathlib diff --git a/pyproject.toml b/pyproject.toml index 56ba14fa7e..7f14971396 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,8 @@ requires-python = ">=3.11" dependencies = [ 'packaging>=22.0', 'numpy>=1.26', - 'numcodecs[crc32c]>=0.14', + 'numcodecs>=0.14', + 'google-crc32c>=1.5', 'typing_extensions>=4.9', 'donfig>=0.8', ] diff --git a/src/zarr/codecs/crc32c_.py b/src/zarr/codecs/crc32c_.py index b2ea356b0c..9536d0d558 100644 --- a/src/zarr/codecs/crc32c_.py +++ b/src/zarr/codecs/crc32c_.py @@ -3,9 +3,9 @@ from dataclasses import dataclass from typing import TYPE_CHECKING, cast +import google_crc32c import numpy as np import typing_extensions -from crc32c import crc32c from zarr.abc.codec import BytesBytesCodec from zarr.core.common import JSON, parse_named_configuration @@ -42,7 +42,7 @@ async def _decode_single( # Need to do a manual cast until https://github.com/numpy/numpy/issues/26783 is resolved computed_checksum = np.uint32( - crc32c(cast("typing_extensions.Buffer", inner_bytes)) + google_crc32c.value(cast("typing_extensions.Buffer", inner_bytes)) ).tobytes() stored_checksum = bytes(crc32_bytes) if computed_checksum != stored_checksum: @@ -58,7 +58,9 @@ async def _encode_single( ) -> Buffer | None: data = chunk_bytes.as_numpy_array() # Calculate the checksum and "cast" it to a numpy array - checksum = np.array([crc32c(cast("typing_extensions.Buffer", data))], dtype=np.uint32) + checksum = np.array( + [google_crc32c.value(cast("typing_extensions.Buffer", data))], dtype=np.uint32 + ) # Append the checksum (as bytes) to the data return chunk_spec.prototype.buffer.from_array_like(np.append(data, checksum.view("B")))