Skip to main content

Cython bindings for Microsoft xVelocity/Vertipaq canonical-Huffman string decoding

Project description

xmhuffman

PyPI version License: MIT

A small, fast Cython extension that decodes the canonical-Huffman string dictionary pages used by xVelocity / Vertipaq column stores — the storage format inside Power BI .pbix files (the DataModel part) and Excel Power Pivot workbooks (xl/model/item.data).

Provides a tight C kernel for what would otherwise be a per-symbol Python loop. On real .pbix files this is 30–50× faster than an equivalent pure-Python implementation and removes a hot path that dominates table extraction time in tools like pbixray.

Installation

pip install xmhuffman

Building from source requires a C compiler and Cython ≥ 3.0:

git clone https://github.com/Hugoberry/xmhuffman-cython
cd xmhuffman-cython
pip install -e .

Usage

The library exposes a tiny surface — one entry point for the common case plus a few lower-level helpers.

Decode a dictionary page

import xmhuffman

# All inputs come straight from the Vertipaq dictionary page metadata:
#   bitstream  — compressed_string_buffer (bytes)
#   encode_array_128 — 128-byte nibble-packed code-length array
#   offsets    — per-string start bit offsets (sequence of u32)
#   total_bits — store_total_bits (end of last string)
strings: list[bytes] = xmhuffman.decode_page(
    bitstream,
    encode_array_128,
    offsets,
    total_bits,
    swap=True,            # apply the byte-pair swap inside the extension
)

Output is list[bytes]. Charset interpretation is the caller's choice (see Character-set modes below): Vertipaq pages declare themselves as either single character set or multiple character set, and the caller decodes the returned bytes accordingly.

Single-charset pages with non-zero CharacterSetUsed

When a single-charset page carries a non-zero CharacterSetUsed byte, the spec requires reinserting that byte as the UTF-16-LE high byte of every decoded character before the byte stream is meaningful as text. xmhuffman can perform that interleave inside the extension:

# charset_mode='single' + charset_byte != 0 returns interleaved bytes,
# each output element being 2 * decoded_length bytes long, ready for
# direct `bytes.decode('utf-16-le')` by the caller.
strings = xmhuffman.decode_page(
    bitstream, encode_array_128, offsets, total_bits,
    swap=True,
    charset_mode='single',
    charset_byte=character_set_used,
)
text = [b.decode('utf-16-le') for b in strings]

For pages with CharacterSetUsed == 0, the default decode_page(...) call is sufficient — b.decode('latin-1') on its output is byte-for-byte equivalent to the interleave path and several times faster, so callers should branch on CharacterSetUsed:

if character_set_used == 0:
    strings = xmhuffman.decode_page(bitstream, encode_array_128,
                                    offsets, total_bits)
    text = [b.decode('latin-1') for b in strings]
else:
    strings = xmhuffman.decode_page(bitstream, encode_array_128,
                                    offsets, total_bits,
                                    charset_mode='single',
                                    charset_byte=character_set_used)
    text = [b.decode('utf-16-le') for b in strings]

For multiple character set pages the raw decoded byte stream is already UTF-16-LE; b[:len(b) & ~1].decode('utf-16-le') is the canonical caller-side path.

Lower-level building blocks

For callers that want to amortize table construction across pages, or just to unit-test pieces:

# Expand the 128-byte nibble-packed array to 256 plain bytes of lengths.
lengths = xmhuffman.decompress_encode_array(encode_array_128)

# Pair-swap a buffer (bytes 2k and 2k+1 swap; trailing odd byte left as-is).
swapped = xmhuffman.swap_bytes(raw)

# Build the flat decode table once, reuse it across decode calls.
table_bytes, max_len = xmhuffman.build_table(encode_array_128)
strings = xmhuffman.decode_with_table(
    bitstream, table_bytes, max_len, offsets, total_bits, swap=True,
)

Format notes

The on-disk format is documented publicly in Microsoft's open specification [MS-XLDM] §2.7.4 — Huffman Compression. Each dictionary page is, schematically:

Field Description
encode_array 128 bytes, two 4-bit code lengths per byte (low nibble = symbol 2i, high = 2i+1). Value 0 means "symbol unused". Per [MS-XLDM] codeword lengths are between 2 and 15 bits.
uiDecodeBits Width of the on-disk primary lookup table (≤ 12). This decoder uses a single flat 2^max_len table instead and ignores uiDecodeBits.
compressed_string_buffer The bitstream itself, with adjacent bytes pair-swapped on disk. No padding between strings.
store_total_bits Total logical bit length; end sentinel for the last string.
vector_of_record_handle_structures Per-record (bit_offset, page_id); sorted offsets per page give the per-string start boundaries.

Codes are classical Huffman, encoded canonically by sorting (length, symbol) ascending and incrementing the code with a left-shift on length changes — exactly the reconstruction described in [MS-XLDM] §2.7.4.1.5.

Character-set modes

[MS-XLDM] §2.7.4.1.4 distinguishes two modes per page:

  • Single character set (character_set_type_identifier = 0x000aba91) — only the low byte of each character is Huffman-encoded; the upper (charset) byte is stored once on the page as CharacterSetUsed and must be reinserted to recover the original 2-byte character stream. Pass charset_mode='single', charset_byte=CharacterSetUsed to decode_page / decode_with_table to have the extension perform that reinsertion. When CharacterSetUsed == 0 you can skip the kwargs and feed the raw bytes output straight to b.decode('latin-1') for the same result at lower cost.
  • Multiple character sets (0x000aba92) — both bytes are encoded; the output byte stream is consumed directly as UTF-16LE.

Reinsertion order is the one the reference encoder/decoder uses: each emitted byte becomes the UTF-16-LE low byte and CharacterSetUsed becomes the high byte, so output element k is exactly bytes([symbol, CharacterSetUsed]) * nwritten.

Performance

Apples-to-apples against an equivalent pure-Python decoder on a few real .pbix files:

File Strings Python ref xmhuffman Speedup
Adventure Works DW 2020 191,489 449 ms 10.0 ms 45×
Sales & Marketing sample 103,290 160 ms 5.3 ms 30×
Retail Analysis sample 9 144 ms 2.9 ms 50×

The kernel does one unaligned 64-bit big-endian load, one shift, one mask, one table lookup and one byte store per output symbol. The decode table is a flat 2^max_len array of uint16_t (≤ 64 KB; usually 1–8 KB) that fits comfortably in L1/L2.

Parallel scaling

decode_page and decode_with_table are designed to run inside a concurrent.futures.ThreadPoolExecutor with no special setup. The entire per-page work — bit-stream walk plus charset reinsertion when requested — happens inside a single with nogil: block. Python objects (the list[bytes] result) are constructed only after the kernel returns, in one tight pass under the GIL.

The practical effect on a 2,703-page workload (meta.pbix, 7.1M strings) on an 8-core M-class machine:

Workers Wall clock Speedup vs. n=1
1 10.85 s 1.00×
2 6.19 s 1.75×
4 3.92 s 2.77×
8 2.60 s 4.17×

Scaling is monotonic up to physical-core count; the function does not fight the GIL on per-string allocation.

Project layout

xmhuffman-cython/
├── xmhuffman.pyx         # Cython surface
├── xmhuffman.pxd         # C declarations
├── src/xmhuffman_kernel.c    # C kernel
├── include/xmhuffman_kernel.h
├── tests/                # correctness tests
└── bench/                # micro-benchmark

Testing

pip install -e .
pip install pytest
pytest tests/ -v

The basic test suite checks each helper against a pure-Python reference implementation. An additional integration test (tests/test_pbix.py) decodes pages out of real .pbix files and asserts byte-identity with the reference; it is skipped automatically when fixtures aren't available.

Scope and non-goals

  • Not a general-purpose Huffman library. Alphabets are fixed at 256 symbols, codeword lengths are capped at 15 bits, and the bitstream convention is the one used by Vertipaq pages.
  • Not an encoder. Round-tripping pages is out of scope.
  • No Python-string outputs. The decoder returns raw bytes; the caller picks between latin-1 and paired UTF-16-LE based on the page's character-set identifier. The charset_mode='single', charset_byte=cb option performs the spec-defined CharacterSetUsed reinsertion as a byte interleave (still bytes out) so the caller can b.decode('utf-16-le') it directly.

License

MIT. See LICENSE.

Acknowledgements

This package is the third in a family of thin Cython wrappers around Microsoft column-store / compression formats, alongside xpress8-python and xpress9-python.

The format itself is documented publicly in Microsoft's open specification [MS-XLDM] — Spreadsheet Data Model File Format, which the implementation here follows. The Python reference and end-to-end test fixtures come from the pbixray project.

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

xmhuffman-0.3.0.tar.gz (180.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

xmhuffman-0.3.0-cp313-cp313-win_amd64.whl (79.2 kB view details)

Uploaded CPython 3.13Windows x86-64

xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (498.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (491.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

xmhuffman-0.3.0-cp313-cp313-macosx_11_0_universal2.whl (171.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ universal2 (ARM64, x86-64)

xmhuffman-0.3.0-cp312-cp312-win_amd64.whl (79.4 kB view details)

Uploaded CPython 3.12Windows x86-64

xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (502.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (496.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

xmhuffman-0.3.0-cp312-cp312-macosx_11_0_universal2.whl (172.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ universal2 (ARM64, x86-64)

xmhuffman-0.3.0-cp311-cp311-win_amd64.whl (78.7 kB view details)

Uploaded CPython 3.11Windows x86-64

xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (512.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (510.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

xmhuffman-0.3.0-cp311-cp311-macosx_11_0_universal2.whl (170.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ universal2 (ARM64, x86-64)

xmhuffman-0.3.0-cp310-cp310-win_amd64.whl (77.7 kB view details)

Uploaded CPython 3.10Windows x86-64

xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (482.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (481.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

xmhuffman-0.3.0-cp310-cp310-macosx_11_0_universal2.whl (171.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ universal2 (ARM64, x86-64)

xmhuffman-0.3.0-cp39-cp39-win_amd64.whl (78.0 kB view details)

Uploaded CPython 3.9Windows x86-64

xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (480.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (480.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

xmhuffman-0.3.0-cp39-cp39-macosx_11_0_universal2.whl (171.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ universal2 (ARM64, x86-64)

File details

Details for the file xmhuffman-0.3.0.tar.gz.

File metadata

  • Download URL: xmhuffman-0.3.0.tar.gz
  • Upload date:
  • Size: 180.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0.tar.gz
Algorithm Hash digest
SHA256 eed562283134825286158216fd94c0e0443b2f6898ee9443a3818aec5cbcd725
MD5 d225c2379293f97c445fb534224b99ca
BLAKE2b-256 195c070c396d1fa710e875158286da3b1778b0f73b1513b922d089027fd4236e

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0.tar.gz:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: xmhuffman-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 79.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a58e8f5545d5189e05f85afe75b906f110fb372baea790b10d4c4cb4b49db7dc
MD5 b4c2c05945628661e82c97002672dc41
BLAKE2b-256 b11d9b4c02565ede72ac1dbcad02a70fe606a8aa06e770253e163dfdb505fd55

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp313-cp313-win_amd64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e7ae41e4ab5f77beca65bcac1b1bedb136fbb373a79e5daabc554b1230278350
MD5 1c621c5b531dacf099f3919759eea39f
BLAKE2b-256 cb3a3f0b97e5ca7d23fbe6d51d98cfef02cc30401a7ead521f3721c06b9a4788

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 31f97a025c687df26fbfbe2eb758f409e9a7cb15e21a4ed7d1b091fb3f1229d7
MD5 884a22d3658459881ac1a1fe9cdd1ad2
BLAKE2b-256 8b28780a5440904085230d6ab9db9c9893f95be4ad8e11dfc91359ff872c2e3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp313-cp313-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 33516f273d2c15b66ac3a3aa44116c4cafb6962660b9a7a60fcedbc2264acb95
MD5 f86ef58e8ea3aefc9061b0f30b218dbb
BLAKE2b-256 17bfad9f241c2b40aace9dcac1bc588342f8332e7b51b8a5c09504046c07c911

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp313-cp313-macosx_11_0_universal2.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: xmhuffman-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 79.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 95be98698242756e7ae58fbb5b6b51b89d644db04836bed6a5d59849b41da878
MD5 039290adeaeb906fa961f8d7c2462ab3
BLAKE2b-256 c98dd2bdf090c890f29aed7c09381fa91ee37eabe2cb8544f9b3f0d422ba97b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp312-cp312-win_amd64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 357ad7e0d0e2f7c683d9bcd17cb04ce0f6db173679ea79c0f8c30c0fe7a0361b
MD5 9ccc9ab614866375a6ea0bbfa5d15f4b
BLAKE2b-256 1b2c549fdf0b06369fa3242b9ff2e2d1cefe0b512717c02be4ae0f3011f0d7dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a2084e805e427cfdc1a37b6a02d047b660f3b41b05c8d730c6aa893ac28109dd
MD5 17359e7f27e7f1df47747cd03b5eba6f
BLAKE2b-256 0bcc6abc3ed6a3edb3889307c74f7e08059783ba5fe1eeabce1b3037a5457cf5

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 b3ae2e16b003510659ba9ce0d18a6dd694d6e92d42050d919f25a267ea304b75
MD5 f3c1e536822f197098dfbec7ee30ea50
BLAKE2b-256 1597e6c5313665a3fac673701df7ba47f4fae7fc8ef8aa332a239e080a8fd7cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp312-cp312-macosx_11_0_universal2.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: xmhuffman-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 78.7 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ee5945ca372ccf30306f0c1a07cac699766da341a2b3d553049dec204ed32205
MD5 04ae754c5290062cc4868fcf2aa77284
BLAKE2b-256 e0e3b93ca92afa05f35ffa9bb71d6fd54be7a9e6d87130638b8226484f1efa1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp311-cp311-win_amd64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ffcd51657bf6a5951a7230470ec49c38192d29d89b1e132795ef9cb32d3863e
MD5 f0c209b4a79ce693096718eaf122afae
BLAKE2b-256 ad6c21a9512841cd27ef2c6bba5a771c226b7ba7febe268de409fb560bdd4e3c

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8feb9ac7d435739e54b8b2d3b35280be0cca7fae6871282b41cf006910851bfc
MD5 3e940f28df092eabcd8888d83e1afa13
BLAKE2b-256 594d980aa01bb844a3684232f470f4b4f68e2a8e4863ebd3718329b19aa32841

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 77f671c8a010b781f16f1c3097954dd37b27bb5b6416eba1fbd6b90fb8507941
MD5 64f291a7ed87cc811c644adbed08200c
BLAKE2b-256 701da5298fb5577486a32f047b7c7dcdc650c2882b6eecae40e369f782f99de0

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp311-cp311-macosx_11_0_universal2.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: xmhuffman-0.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 77.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2e4af3831cc64b54cdd9c70fd4233db42dbb32fef56bc49900394afec36bd0ed
MD5 5615898aeb34a22a76031dfcf4ff0cd8
BLAKE2b-256 99330a8853934450b24b548d26d8d777636befc5444def300c0a97b22357e37c

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp310-cp310-win_amd64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c4c2344fcc379ea123c5c633fe612e6662d2e73c1d190f82e0ddec78201c30ee
MD5 4a03fa8481b964f0ed7688b09177798e
BLAKE2b-256 734c57b1c3e660180c4a36c36427044ab6305542c239dd95ff1f470d5a92aa90

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 66795bf80251e5a963a0a0d7a5fe87868df177dc5af585a464c6e9558a53fffd
MD5 355f44f1858a7aef2bb1f5ce7c79fe16
BLAKE2b-256 d9ffae7bfa7262bd9699560e6a6f881723fa224a7a2ddd7e2df4e709a0a75d7b

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 c7e4aeb02180dc388a44aaa972942cf8360bdeaf13800c06e9e4b37257c9a929
MD5 7174a039eff3801d47edb4ef3c2201c2
BLAKE2b-256 8bfca469ceab0a904f51823042b49de80300ae01db0a3f424de1046118500568

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp310-cp310-macosx_11_0_universal2.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: xmhuffman-0.3.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 78.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xmhuffman-0.3.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 330a4d67c8dbfe6fb3eff4a857b5c3aac0313e1b4227aa370d51bb33ac7c9986
MD5 9a4ae49514215f91bd5dc1dc879d6550
BLAKE2b-256 ab6807fec6a49db573e4b47b8ea366fd6db1aa2112bec8a8658dd6427c02cd8e

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp39-cp39-win_amd64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 33f6c0c2b0d0bf51352201bc30f6949e7c098c8e1c2c62802c672fc1bb477a6f
MD5 80201b3a8eea078a7e35b15edc7637aa
BLAKE2b-256 35a6124853b5f9cf9af2e415df29b5b9b017bf26843c1eaaea3d950d4acde375

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d4fabdc4543f99380271f439859a5b29350a18d5d954eeac83d67ddc09e642fe
MD5 03c3554fa19dde3109dcd27ad6426bbb
BLAKE2b-256 fa22454a5a60cb96f5bf8c74a908a6b8c80a24bb59f39a0ab1ddefc7022ff4c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xmhuffman-0.3.0-cp39-cp39-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for xmhuffman-0.3.0-cp39-cp39-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 7a9fe2f1939a6edf585bce91465eb74956ec61b0d413aab12a47faa3ddc42232
MD5 f62be87060d3b954af6d837d2976e23b
BLAKE2b-256 f5c7c0b7b72709d85a41d9e84a9117435ade4e962eb141905576d6f1f511e540

See more details on using hashes here.

Provenance

The following attestation bundles were made for xmhuffman-0.3.0-cp39-cp39-macosx_11_0_universal2.whl:

Publisher: build.yml on Hugoberry/xmhuffman-cython

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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