Skip to main content

A fast, efficient, portable erasure coding tool

Project description

Generate redundant blocks of information such that if some of the blocks are lost then the original data can be recovered from the remaining blocks. This package includes command-line tools, C API, Python API, and Haskell API.

Package Build Tests on Intel hardware Tests on ARM qemu-emulated environment Haskell API PyPI release status

Intro and Licence

This package implements an “erasure code”, or “forward error correction code”.

You may use this package under the GNU General Public License, version 2 or, at your option, any later version. You may use this package under the Transitive Grace Period Public Licence, version 1.0 or, at your option, any later version. (You may choose to use this package under the terms of either licence, at your option.) See the file COPYING.GPL for the terms of the GNU General Public License, version 2. See the file COPYING.TGPPL.rst for the terms of the Transitive Grace Period Public Licence, version 1.0.

The most widely known example of an erasure code is the RAID-5 algorithm which makes it so that in the event of the loss of any one hard drive, the stored data can be completely recovered. The algorithm in the zfec package has a similar effect, but instead of recovering from the loss of only a single element, it can be parameterized to choose in advance the number of elements whose loss it can tolerate.

This package is a fork of zfec library, which is largely based on the old “fec” library by Luigi Rizzo et al., which is a mature and optimized implementation of erasure coding. The zfex package makes several changes from the original zfec package, including new C-based benchmark tool and a new SIMD-friendly API.

Installation

pip install zfex

To run the self-tests, execute tox from an unpacked source tree or git checkout.

To run the tests of the Haskell API: runhaskell haskell/test/FECTest.hs

Note that in order to run the Haskell API tests you must have installed the library first due to the fact that the interpreter cannot process FEC.hs as it takes a reference to an FFI function.

To install zfex built with custom compilation flags, execute:

CFLAGS="-O3" pip install git+https://github.com/WojciechMigda/zfex.git

If zfex is already cloned locally, then custom compiler flags can be passed to setup.py to install zfex like follows:

CFLAGS="-O3" python setup.py install

In similar manner, one can override compiler being used. Simply issue:

CC=arm-linux-gnueabihf-gcc-7 pip install git+https://github.com/WojciechMigda/zfex.git

Community

The source is currently available via git on the web with the command:

git clone https://github.com/WojciechMigda/zfex

If you find a bug in zfex, please open an issue on github:

<https://github.com/WojciechMigda/zfex/issues>

Overview

This package performs two operations, encoding and decoding. Encoding takes some input data and expands its size by producing extra “check blocks”, also called “secondary blocks”. Decoding takes some data – any combination of blocks of the original data (called “primary blocks”) and “secondary blocks”, and produces the original data.

The encoding is parameterized by two integers, k and m. m is the total number of blocks produced, and k is how many of those blocks are necessary to reconstruct the original data. m is required to be at least 1 and at most 256, and k is required to be at least 1 and at most m.

(Note that when k == m then there is no point in doing erasure coding – it degenerates to the equivalent of the Unix “split” utility which simply splits the input into successive segments. Similarly, when k == 1 it degenerates to the equivalent of the unix “cp” utility – each block is a complete copy of the input data.)

Note that each “primary block” is a segment of the original data, so its size is 1/k’th of the size of original data, and each “secondary block” is of the same size, so the total space used by all the blocks is m/k times the size of the original data (plus some padding to fill out the last primary block to be the same size as all the others). In addition to the data contained in the blocks themselves there are also a few pieces of metadata which are necessary for later reconstruction. Those pieces are: 1. the value of K, 2. the value of M, 3. the sharenum of each block, 4. the number of bytes of padding that were used. The “zfex” command-line tool compresses these pieces of data and prepends them to the beginning of each share, so each the sharefile produced by the “zfex” command-line tool is between one and four bytes larger than the share data alone.

The decoding step requires as input k of the blocks which were produced by the encoding step. The decoding step produces as output the data that was earlier input to the encoding step.

Command-Line Tool

The bin/ directory contains two Unix-style, command-line tools zfex and zunfex. Execute zfex --help or zunfex --help for usage instructions.

Performance

TODO: update with new results

To run the benchmarks, execute the included bench/bench_zfec.py script with optional –k= and –m= arguments.

On my Athlon 64 2.4 GHz workstation (running Linux), the “zfec” command-line tool encoded a 160 MB file with m=100, k=94 (about 6% redundancy) in 3.9 seconds, where the “par2” tool encoded the file with about 6% redundancy in 27 seconds. zfec encoded the same file with m=12, k=6 (100% redundancy) in 4.1 seconds, where par2 encoded it with about 100% redundancy in 7 minutes and 56 seconds.

The underlying C library in benchmark mode encoded from a file at about 4.9 million bytes per second and decoded at about 5.8 million bytes per second.

On Peter’s fancy Intel Mac laptop (2.16 GHz Core Duo), it encoded from a file at about 6.2 million bytes per second.

On my even fancier Intel Mac laptop (2.33 GHz Core Duo), it encoded from a file at about 6.8 million bytes per second.

On my old PowerPC G4 867 MHz Mac laptop, it encoded from a file at about 1.3 million bytes per second.

Here is a paper analyzing the performance of various erasure codes and their implementations, including zfec:

http://www.usenix.org/events/fast09/tech/full_papers/plank/plank.pdf

Zfec shows good performance on different machines and with different values of K and M. It also has a nice small memory footprint.

API

Each block is associated with “blocknum”. The blocknum of each primary block is its index (starting from zero), so the 0’th block is the first primary block, which is the first few bytes of the file, the 1’st block is the next primary block, which is the next few bytes of the file, and so on. The last primary block has blocknum k-1. The blocknum of each secondary block is an arbitrary integer between k and 255 inclusive. (When using the Python API, if you don’t specify which secondary blocks you want when invoking encode(), then it will by default provide the blocks with ids from k to m-1 inclusive.)

  • C API

    fec_encode() takes as input an array of k pointers, where each pointer points to a memory buffer containing the input data (i.e., the i’th buffer contains the i’th primary block). There is also a second parameter which is an array of the blocknums of the secondary blocks which are to be produced. (Each element in that array is required to be the blocknum of a secondary block, i.e. it is required to be >= k and < m.)

    The output from fec_encode() is the requested set of secondary blocks which are written into output buffers provided by the caller.

    There is another encoding API provided, fec_encode_simd(), which imposes additional requirements on memory blocks passed, ones which contain input blocks of data and those where output block will be written. These blocks are expected to be aligned to ZFEX_SIMD_ALIGNMENT. fec_encode_simd() checks pointers to these blocks and returns status code, which equals EXIT_SUCCESS when the validation passed and encoding completed, or EXIT_FAILURE when input and output requirements were not met.

    Note that this fec_encode() and fec_encode_simd() are a “low-level” API in that it requires the input data to be provided in a set of memory buffers of exactly the right sizes. If you are starting instead with a single buffer containing all of the data then please see easyfec.py’s “class Encoder” as an example of how to split a single large buffer into the appropriate set of input buffers for fec_encode(). If you are starting with a file on disk, then please see filefec.py’s encode_file_stringy_easyfec() for an example of how to read the data from a file and pass it to “class Encoder”. The Python interface provides these higher-level operations, as does the Haskell interface. If you implement functions to do these higher-level tasks in other languages, please send a patch so that your API can be included in future releases of zfex.

    fec_decode() takes as input an array of k pointers, where each pointer points to a buffer containing a block. There is also a separate input parameter which is an array of blocknums, indicating the blocknum of each of the blocks which is being passed in.

    The output from fec_decode() is the set of primary blocks which were missing from the input and had to be reconstructed. These reconstructed blocks are written into output buffers provided by the caller.

  • Python API

    encode() and decode() take as input a sequence of k buffers, where a “sequence” is any object that implements the Python sequence protocol (such as a list or tuple) and a “buffer” is any object that implements the Python buffer protocol (such as a string or array). The contents that are required to be present in these buffers are the same as for the C API.

    encode() also takes a list of desired blocknums. Unlike the C API, the Python API accepts blocknums of primary blocks as well as secondary blocks in its list of desired blocknums. encode() returns a list of buffer objects which contain the blocks requested. For each requested block which is a primary block, the resulting list contains a reference to the apppropriate primary block from the input list. For each requested block which is a secondary block, the list contains a newly created string object containing that block.

    decode() also takes a list of integers indicating the blocknums of the blocks being passed int. decode() returns a list of buffer objects which contain all of the primary blocks of the original data (in order). For each primary block which was present in the input list, then the result list simply contains a reference to the object that was passed in the input list. For each primary block which was not present in the input, the result list contains a newly created string object containing that primary block.

    Beware of a “gotcha” that can result from the combination of mutable data and the fact that the Python API returns references to inputs when possible.

    Returning references to its inputs is efficient since it avoids making an unnecessary copy of the data, but if the object which was passed as input is mutable and if that object is mutated after the call to zfex returns, then the result from zfex – which is just a reference to that same object – will also be mutated. This subtlety is the price you pay for avoiding data copying. If you don’t want to have to worry about this then you can simply use immutable objects (e.g. Python strings) to hold the data that you pass to zfex.

    Currently, fec_encode_simd() C API does not have a python wrapper.

  • Haskell API

    The Haskell code is fully Haddocked, to generate the documentation, run runhaskell Setup.lhs haddock.

Utilities

The filefec.py module has a utility function for efficiently reading a file and encoding it piece by piece. This module is used by the “zfex” and “zunfex” command-line tools from the bin/ directory.

Dependencies

A C compiler is required. To use the Python API or the command-line tools a Python interpreter is also required. We have tested it with Python v2.7, v3.5 and v3.6. For the Haskell interface, GHC >= 6.8.1 is required.

Acknowledgements

Thanks to the author of the original fec lib, Luigi Rizzo, and the folks that contributed to it: Phil Karn, Robert Morelos-Zaragoza, Hari Thirumoorthy, and Dan Rubenstein. Thanks to the Mnet hackers who wrote an earlier Python wrapper, especially Myers Carpenter and Hauke Johannknecht. Thanks to Brian Warner and Amber O’Whielacronx for help with the API, documentation, debugging, compression, and unit tests. Thanks to Adam Langley for improving the C API and contributing the Haskell API. Thanks to the creators of GCC (starting with Richard M. Stallman) and Valgrind (starting with Julian Seward) for a pair of excellent tools. Thanks to employees at Allmydata – http://allmydata.com – Fabrice Grinda, Peter Secor, Rob Kinninmont, Brian Warner, Zandr Milewski, Justin Boreta, Mark Meras for sponsoring part of this work (original zfec) and releasing it under a Free Software licence. Thanks to Jack Lloyd, Samuel Neves, and David-Sarah Hopwood. Last, but not least, thanks to the authors of original zfec library, from which this one forked from. Thanks to Gabs Ricalde, for contributing ARM SIMD-optimized code to zfec, which then inspired Intel SIMD-optimizations introduced here.

Download files

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

Source Distribution

zfex-1.5.8.2.tar.gz (81.5 kB view details)

Uploaded Source

Built Distributions

zfex-1.5.8.2-pp38-pypy38_pp73-win_amd64.whl (65.7 kB view details)

Uploaded PyPy Windows x86-64

zfex-1.5.8.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (102.0 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

zfex-1.5.8.2-pp37-pypy37_pp73-win_amd64.whl (65.7 kB view details)

Uploaded PyPy Windows x86-64

zfex-1.5.8.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (100.6 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

zfex-1.5.8.2-cp310-cp310-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

zfex-1.5.8.2-cp310-cp310-win32.whl (63.3 kB view details)

Uploaded CPython 3.10 Windows x86

zfex-1.5.8.2-cp310-cp310-musllinux_1_1_x86_64.whl (93.9 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

zfex-1.5.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (89.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (87.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

zfex-1.5.8.2-cp310-cp310-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

zfex-1.5.8.2-cp310-cp310-macosx_10_9_x86_64.whl (62.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

zfex-1.5.8.2-cp39-cp39-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.9 Windows x86-64

zfex-1.5.8.2-cp39-cp39-win32.whl (63.4 kB view details)

Uploaded CPython 3.9 Windows x86

zfex-1.5.8.2-cp39-cp39-musllinux_1_1_x86_64.whl (93.6 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

zfex-1.5.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (89.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (87.4 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

zfex-1.5.8.2-cp39-cp39-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

zfex-1.5.8.2-cp39-cp39-macosx_10_9_x86_64.whl (62.7 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

zfex-1.5.8.2-cp38-cp38-win_amd64.whl (65.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

zfex-1.5.8.2-cp38-cp38-win32.whl (63.3 kB view details)

Uploaded CPython 3.8 Windows x86

zfex-1.5.8.2-cp38-cp38-musllinux_1_1_x86_64.whl (93.5 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

zfex-1.5.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (89.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (87.8 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

zfex-1.5.8.2-cp38-cp38-macosx_11_0_arm64.whl (62.5 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

zfex-1.5.8.2-cp38-cp38-macosx_10_9_x86_64.whl (62.7 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

zfex-1.5.8.2-cp37-cp37m-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

zfex-1.5.8.2-cp37-cp37m-win32.whl (63.3 kB view details)

Uploaded CPython 3.7m Windows x86

zfex-1.5.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl (93.2 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (88.1 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (86.4 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ ARM64

zfex-1.5.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (93.8 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

zfex-1.5.8.2-cp37-cp37m-macosx_10_9_x86_64.whl (62.7 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

zfex-1.5.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl (92.3 kB view details)

Uploaded CPython 3.6m musllinux: musl 1.1+ x86-64

zfex-1.5.8.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (88.1 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.17+ x86-64

File details

Details for the file zfex-1.5.8.2.tar.gz.

File metadata

  • Download URL: zfex-1.5.8.2.tar.gz
  • Upload date:
  • Size: 81.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2.tar.gz
Algorithm Hash digest
SHA256 ddf0f61ebfd2cb52bbf1955d7a0e24a624ebc243f91a7eafeb79202e6a199ede
MD5 85c03e8e788ed2252c5088df9a1014d4
BLAKE2b-256 870290c759fbd80b2a6bf02a0592a7961c86fd5b6372efd9f3e13765053a07eb

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp38-pypy38_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 aa2dcb13ec7bbd50ad2ff7203906be232826f3c6212e6b25eb295155300fd07c
MD5 cfb33285c5025dbc368035c80f42ab65
BLAKE2b-256 ed313045ca2e681ed319a6ef867edb9f1ddc38a920fc353727cfd511d6d34df1

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ec365a6ed5f2da283cbe2daab15a53151242c032577010c748223f2170403bf1
MD5 23fb2faa7c3572fcf242988478817f4d
BLAKE2b-256 e55db014c3315182c2abc573a1893b6b6c657d3edee3d3dfea3b92935edb4413

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ef6dc32b6c0acd0b5f5772c528ca7cac675e2a1fec12df80dd19a0adc2fa9588
MD5 95ea375878044baa0dd222874bc5525b
BLAKE2b-256 d7f4080559423654205d6026ceff82546b36c0c884d31c5f3f31556525523ea1

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 688bcb0ade80b079860e9b70330e4e0c75af07e8c35f9cfb929a3826cc45d7b6
MD5 cb7550bd7cadd48e40516e85f297117e
BLAKE2b-256 6792940c3db4a5002dff72337f2af57aa98c3ae8b3a95903d32eee74f502fb36

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3e0491131b3374508c8e10fbbdae3215f551239738f71ef2d618cb9b06431ed6
MD5 36ade802b8593a04db1cccabe4b21375
BLAKE2b-256 5ebb8bb87923e14e96191d63aa5845cccca499ea9ddf409163c9a18fff60067d

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a8cc8863bd9840fb65b451abdb20818fa2a7f85c6b7ab564af119f969787e061
MD5 8edd5a9bf2e2685a9d9b1e30b1b69421
BLAKE2b-256 749f05de1453f41fb226c1d41623aa7e9c13de709b99f39e07776fc229e9974c

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 335491d24b2ee6cb4e02f41d37b38dbf9e7eee2b4672fff99562597a42039337
MD5 daea58ce3318288a5e63a30c8ed9bf01
BLAKE2b-256 f81edc55e3fdbfb06151d7015b12564e9de21878e606b3b95453f1e80c1fd5ed

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp310-cp310-win32.whl
  • Upload date:
  • Size: 63.3 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 cb57d786bdb732e5bc26eb4a29dc3c6f40dfd0640703fc016bbe4e438684f586
MD5 3c1c9fcf2e1ee60f71328c0a7a41e594
BLAKE2b-256 e4f28d6dd15efde401cfea2ac524f896b616946d8c9aa6e739b9446ea128672e

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3595fc567705ec091a8bfacda57b7eb96b96b257441dba13bf74b074d2ca2814
MD5 730c29ffea0b4d4ba808e9cd2f62fe5a
BLAKE2b-256 180a7721ead1922a6d55211629149c912822cbfc7198a8f265eefd4660cb9215

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 802d27bfac4499b95ee597486729b167bbcc305f48c0088adcb91ce8f022805f
MD5 f13ce74648747970580ccf6705fd4920
BLAKE2b-256 32da763f3c8ea96683d925c251cc39b8d7549e56692fb0c5616918441ea9e164

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e0c27d408a367208757f60fdc86ea8d200298e8de629fbc2656bcb15bb9cc761
MD5 ef351443cb26ae4a46cab6204e586134
BLAKE2b-256 e1f85dd8b372a1db4669664c24dfe4ef3590acc59b556527b7566687cd90455a

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd18ab51fde4ae471a3c2e097ba438c20087013d299ecde6a06384cc506d483c
MD5 d2673c5741f37557d5a0b1201808866c
BLAKE2b-256 ad8424da2b02280402ab74b9c46faac8d9f27f3c1387dce4691ca62e2df56819

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e67486213054d2bbc632126e28d34b5f9546b0b2c0523e186b16f64a3f0eea1e
MD5 2df2c165015f760fcecee337a0889521
BLAKE2b-256 dbaea1a1dd330f3182fc4205609d76135c5638817e2f9a9a4d7fe570432c3c1e

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 168629cbe5d1e6491a9661328cb5e5cb79297f57fc2c14ced2a6a4759c42be04
MD5 9b85127964687c2ce562faed02455fa7
BLAKE2b-256 b5446e6bae7b31a7e69c45072f06a15adf97f204e8ee15a8489086ad679a72d8

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp39-cp39-win32.whl
  • Upload date:
  • Size: 63.4 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 965749b6befa6b1d405826dadf50c873a69d47435fbfd64a3ef916e1616c0877
MD5 cda0f0e2c6938c6818750c4e927aa9ef
BLAKE2b-256 cad19af089a6507971dcacfca68bf5917d1f5a173e5d07f17cc5485c5e20976f

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 9283112c994669e7db5148ec335301eef5e9af25770f91aa074f9321ddab9f58
MD5 2d08388e58d24ad70e6c6dd953cd7fb0
BLAKE2b-256 6e3a80b975b198269790c4571b813ed1deb65273b5fa95a96be4ffa9e770be00

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f171b6bb2c42658c65f9adfc8062a1acdf7c5d8a5e9db7b8605908ffe4a31488
MD5 b81e49fd3e203265fba783732062cffb
BLAKE2b-256 0f92f6b90507cbe1b43d8fce976623f94460748ad9f65b110c21d9ffed14bd99

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 442f203a588fd6d99c6df7c4e43d460e8acb5daf95e59ab7d1ac8938e93ff1b4
MD5 4feab348459490db4e2ecae0abc84a9d
BLAKE2b-256 a2880c8c6b3d990deb6520ea8cc7a79be4ddca235468d383c993463df4f402d6

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04965eff4d579edd55bff7f49d076e2246d2b382a4b371401a9ec01e1bfed9b5
MD5 32b0a245f504f9d92624d5d716b52f8f
BLAKE2b-256 3c95e85b2241fe89901854bfee9d353cd598c651bdb29d485e4fbd92ab5fd5bb

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fbd071cefe5cb8fb8bb16a0831fe82ce7f4263475c7dc274015bbd9861a548d8
MD5 463ba75a6976f4e178d54dd0e85c88a2
BLAKE2b-256 eb206f90729e30836b31f23bdbc6178d9273ad6cb9e715cf160312c807411c57

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.7 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3f906f414ac1f4954f887bfe60642f1ba6b4c386fd1e5436f3ba1c2b0ac33cdf
MD5 cfe369032777d5f84db5442f7e71ee66
BLAKE2b-256 631dbc43a8b51ef90f40a0be34d7cfa9acee2d25e09c78fabc201e562abe6adf

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp38-cp38-win32.whl
  • Upload date:
  • Size: 63.3 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 66eb1080e003db08a5d25f28c0e0ca67bedd54f6c7d76c7e2ff809f1aad0db80
MD5 60383ff2dafa483c66531b019d6d38b1
BLAKE2b-256 4b291fb5ddb74f152b30e63abd5d04a65f60f032978f27a3b697046641276483

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 89d9108aa9f8b5f93f715f3fcca51866f347d86303a9186cf38701c858f8cdcc
MD5 1bf266dfa255978ce5a78b7b59076d4c
BLAKE2b-256 334cb4e21a0e7cdeae41f519a2c452c364525c9d29f0693e8080364809c4c3ac

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ad8c33acd9dedd454e353e47e7f19f8a1d410b6eb78e9138cd17b0a150251be5
MD5 71b24801ec3bd8356d87825cd89374f2
BLAKE2b-256 bb5725e4e1374e8327930c8226cee8af6670bada9747eae49e1a5609e41e14b5

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2a290c8666977a8ef1516511e3c0413aaad18d1ba259682215d718a5096299da
MD5 a0cde75bd64d56348b0a4a0326f870a7
BLAKE2b-256 5fa1bcacee6a344ddb1db24778ebe00aa9544a8be4cac58ddad6b316f7358508

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec064e0c1dd0908d098bdcd97072443336c65590debbd4c0492b53d2ff420bf6
MD5 2266c64efe1be85c682bad01009aa094
BLAKE2b-256 10b120df054f12a374d5caa22ec0c4b395c0f295e8807860bda077ebb156d327

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2548bbc99a1fcd6bc1e5ae793b220a9a846d443320fbb21bf01c8b4934482154
MD5 4571bc4642a65ff5196b3df6b8d6a6a3
BLAKE2b-256 e8f387ee5fa5e507f4bb44217f6bf368977fb5be96110b252b85cb8a49e43d2f

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 a2a0fc93644420d12121a5b9b0288e59549044be0b7555f0d1beb3a2cc4d02bc
MD5 c225b3c087c8695e70e87ae1195c4510
BLAKE2b-256 1f07d3a858cfcecbae47250e5ad3e91aafa7b9177cd10dcd12feceb868953e29

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.2-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 63.3 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 fe2a175caf368aae5aa0b4602e14d8c383620846cab3f941fcb6464a15cc1348
MD5 61ae039b41b38eac5bb9ccddbdfbbb4a
BLAKE2b-256 361128895ee99be6474b5d3b10df6e4f9c779f9d6f0b52fd2a1ad0e96ed88858

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4e9e1a6641d06888032e61030d07523c37463f77a9342b2d6eb49bccd9638783
MD5 dbd6207eab47833c2222643158e35e42
BLAKE2b-256 232846524f92039ee3823629ab050b56c639885458410053764ac6f9640df06b

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 61f990794a7d85ede34b03e7b21e1fd55834274281f83e44f145636e90e22c84
MD5 d7adece05d40e2289df87225b69cc1d8
BLAKE2b-256 1ed2c30d75d1a1ee4d2cb7dcd6704e4776ef08ee5fb3410af95c5bcd83727a1f

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b209d30958409dc6e985534e485f293286cc3977abee4fbc5350d5c7bc0ce9d1
MD5 fdeaa49708ddcec2b426271987155cc5
BLAKE2b-256 8aaae3a7b9af9f76db3e72bf7f8204d8456da1e2019bff8bc48730f23f2ae41e

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 62b4ba3ebc85d29f01eb2107b767c72f620e75c2002e97eda88cc999b4db584c
MD5 e4646ff2285269622d083d6ab3c191f2
BLAKE2b-256 21446d6b59ac0291b40e83f4655c619fbc054a0c938f75d77abd4b49a3eeb6bb

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 92c7ddb0c4541c99d07ced0fdbaf00d927ec492636bf5866982e824a8ca036a4
MD5 a59807b0f1c16ad9aec155d3cba53aa1
BLAKE2b-256 390f0709245bf477b16f8d9cf6f366c685886d84700ad2da32e171f4d37015bc

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d21baf3bb6e5a99d2addfd7e393e0ccd26767def3e2a256cee48a898aa100384
MD5 d0dc8ae1c0a94c031c34a8f920f1ed20
BLAKE2b-256 c21ca7c6473c8ee746a6cdf1f03d4c878fe4debeba7fb2cd111dbdfc027165c7

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 060c94aebb0845223de763496692e90125e2f88af301da3d06204ddd55fea323
MD5 8847d2157d8849a4d2d31a15e1398d19
BLAKE2b-256 64261206ec43780291210bf327954676a0311afe902afd85daf8d85787bdf8e6

See more details on using hashes here.

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