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 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.0.tar.gz (81.6 kB view details)

Uploaded Source

Built Distributions

zfex-1.5.8.0-pp38-pypy38_pp73-win_amd64.whl (65.3 kB view details)

Uploaded PyPy Windows x86-64

zfex-1.5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (63.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.3 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (61.8 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

zfex-1.5.8.0-pp37-pypy37_pp73-win_amd64.whl (65.3 kB view details)

Uploaded PyPy Windows x86-64

zfex-1.5.8.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (63.7 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.3 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (61.8 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

zfex-1.5.8.0-cp310-cp310-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.10 Windows x86-64

zfex-1.5.8.0-cp310-cp310-win32.whl (62.9 kB view details)

Uploaded CPython 3.10 Windows x86

zfex-1.5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl (93.5 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

zfex-1.5.8.0-cp310-cp310-musllinux_1_1_i686.whl (88.5 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

zfex-1.5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (88.9 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.3 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-cp310-cp310-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

zfex-1.5.8.0-cp39-cp39-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

zfex-1.5.8.0-cp39-cp39-win32.whl (62.9 kB view details)

Uploaded CPython 3.9 Windows x86

zfex-1.5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl (93.2 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

zfex-1.5.8.0-cp39-cp39-musllinux_1_1_i686.whl (88.3 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

zfex-1.5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (88.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-cp39-cp39-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

zfex-1.5.8.0-cp38-cp38-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.8 Windows x86-64

zfex-1.5.8.0-cp38-cp38-win32.whl (62.9 kB view details)

Uploaded CPython 3.8 Windows x86

zfex-1.5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl (93.1 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

zfex-1.5.8.0-cp38-cp38-musllinux_1_1_i686.whl (88.2 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

zfex-1.5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (89.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-cp38-cp38-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

zfex-1.5.8.0-cp37-cp37m-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.7m Windows x86-64

zfex-1.5.8.0-cp37-cp37m-win32.whl (62.8 kB view details)

Uploaded CPython 3.7m Windows x86

zfex-1.5.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl (92.8 kB view details)

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

zfex-1.5.8.0-cp37-cp37m-musllinux_1_1_i686.whl (87.9 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

zfex-1.5.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (87.7 kB view details)

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

zfex-1.5.8.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (84.1 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zfex-1.5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl (62.2 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: zfex-1.5.8.0.tar.gz
  • Upload date:
  • Size: 81.6 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.0.tar.gz
Algorithm Hash digest
SHA256 367c12cf2afa0cb7061fa94c50e93a79e03c4617999fefc4cbd30319c97d0a4b
MD5 c3d3e4f43613c771f81a5ca78ea02fdf
BLAKE2b-256 84bcca5a16934b07514f281d87a73c7804f3408484b7c074e6d9d2c8325dd4a4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 7e5a1a38da8298be20b6f8675a3a32baa918c5d68b805d574c8447364b8314af
MD5 c0a2d8df6f5c81b6919f267be71715f7
BLAKE2b-256 967567d0a63611114e143cfb6b9971119223ca1b5eb6e27d0bdb9ca4082e0888

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fa83546690f2bc56f7f0e4a5d0a5e1692e84a75d50139c7b84cf3e3f89c016c9
MD5 d0d765203bef7b4a944aa3afedd6331c
BLAKE2b-256 c4b59f912fbc283947c542b647e97baaeb1c06468d20a362f73dc544b1967b8e

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f3162f2e6436c811365901912d9b037be24f71e4d60a7d348ecd00c57bcf89c1
MD5 72e876bc0a0b7e2c24df0346e83c503b
BLAKE2b-256 4ddb9e7f1f2d2083c28273d8196f3a032b3041bb3e093cdd2b24b6eda815782a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b157ce2ba5c0993dfe7b3cc0681a3ecf402aa24facc1b0839654d75fa8c98d70
MD5 1d33c0e4cd9f340bcae138f9e47619c8
BLAKE2b-256 529d6e5fc0268e892c94d9bfce20d9542f1a0449411f762725e63045a26ee187

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 d306c61452205b7d422f807136da2ab660a5362a8b8eb0ad2f9356d38e49b2f1
MD5 551a43a7d7992acb73ff01455fad334e
BLAKE2b-256 4595e8eff4c064df9a9f57c7cf4a815b58731a1d649c942295dd3c063e4f3203

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f51e924401876b46a74ee4dc43fa68ade4c7115b04808bd9e0ee67391a38e4d
MD5 0d95954eba74f9abf0a890fb9a08d1d6
BLAKE2b-256 b8ea725fe5ac6038456ca10cb86664d9a6b53e543f95e910f5d263d9a0f3c678

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e0fc30e93a1fde5d91be2feca98f716710e3d28b8aad2ec3fc153ff6bb4b61bf
MD5 ff3f08b3560c4492a85e05d0c6c151d6
BLAKE2b-256 2b7a3d6ac9bc4e792af18b64e52e0244538c906edb33b94796d8eb2573c7f53e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6d6ca1964204229d9566b9d60a0bc3ab9ad63db97b28c5f3193d6b8510332ab4
MD5 ae840384017fe3eb86709cdd635ea6dd
BLAKE2b-256 fed9312f8c88ef2ff40c36ea59d77da2bfef4178edec89473f25219612b2ec1c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.2 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 143b0cf31d57a3c270c4a7b08cad9978581b8cd70b6469de8c95b5ce70a9bfeb
MD5 85aecf7f12d8b6c4bb7b1b948a9ae5b6
BLAKE2b-256 ace0b9c7ca6db101bf4529d012d9c13e9f70a88635e9837d5d640397d601bfc6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 62.9 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.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 d644d356ecf3f7188ae1e2d1845ec371ebc0fc04ccde879781289837ec44dddd
MD5 d613ca952a22556f4dd2d3bd5627510a
BLAKE2b-256 fea4938ebefe0579e005824e4d732ee5a035dde1cd2f76be1224df5c8916782f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 dbbb963f021438cc39dfedb618435c77431c2e3be322e0762e9fb6ce8edf638f
MD5 159e68775b6f274c0fa4d83fbcb2d805
BLAKE2b-256 0bf98f384b6e7995a54ace0b0c5ae8a26d9da05977a3945c27b47c96b006ac74

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 975c3f392fe4b4417ca746c32a17f5ad56f6a028f7d5a9e9e714b2c5b89bd469
MD5 9d959614d1ce90a545e1037934ea1ecf
BLAKE2b-256 34d1535efb3d93108ea8cb6c4da4b42df2b2326d7910a0bfe72b36caf2bc9aab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d392c1f625c8f584a956da04b6af9dacca746be8cbc6e8838f25dac6578f8fde
MD5 0c9242edc25e8fc9548e50bd128d679b
BLAKE2b-256 830718779d8fbd06415649568a0478b2081df5c4be3e2cbb950d93d930684f53

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 065ee563cfc6c4f32e320bf9fb64a2993f6c85629b7a61bd32ada2bb459ce53f
MD5 a393229a523fc2eacce171715ee1338a
BLAKE2b-256 177971501c0208cbed0469c361ba92588703eb2f7d78281b8520136ca503c343

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0b91fc3d264817be8f66f35ea9a66868f796669b82b0dfc0ea08205360205a0a
MD5 f6038b5db0078cea4bc4fe2bfc579a4c
BLAKE2b-256 03182a1416405a27053b0080fae4d5e30d3db06fbc60a9d9efaaf680d530615f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.2 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.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 cd1bfce62d83b856e5c35e16b7a2a498675ac301a2ce6c2d900c12c6fd795be6
MD5 4f73b634be7920d9602dda394e6c2c6c
BLAKE2b-256 c2e461244f70875c6bdf59745108e13b805fd65aa9811edbffb57c580ee783ef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp39-cp39-win32.whl
  • Upload date:
  • Size: 62.9 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.0-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 e2124b7859765459ea85cd7bd05f27451045416062aabdfc4be9ae4b1813509c
MD5 d4bf92bfbe20b77dc64b537f0a5cad59
BLAKE2b-256 183434d861ff133564edd7220c91e14928b1e926ff60ae29a51f52ce7a9db9ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d6bd671732e3c79781840cd5b6b0787211eba1d39f4eb98b09b2614a2e510b81
MD5 554986c4d9a8eaf0db78bb32c6d94c55
BLAKE2b-256 490dc2fcd68a88469aec66cf158e13c97d8b88e0b1020ca0941db74a486ec8c0

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 7f1f885cb2e209400264a5962268eedf0c5f22c50af4dfd070fed23040ef861f
MD5 1e53c64831d54a211efd057f420d86eb
BLAKE2b-256 34a60c9621e6b073d79330c5282f91ea034b1e4afe4036cc9fe9c43a072ef8cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ac3a3a5f7b7e3dcb93deef6e66cbb230a9d457d4aff9a545171d33a10851232d
MD5 c140a379aacce14946da3dfd974c830e
BLAKE2b-256 f331923899f86475e88aded8d33761af6ab3ebc589ed04b0f22030237279798c

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7c5f2385a4617cedcd60783cadc1150a53d209722906a9f5fefecd9875a84e12
MD5 0d4662cdabb2ce76e04ba3da4091ddf7
BLAKE2b-256 177d22c183557b9cb61d9609f456244908f7dd1d0f75b4c51086bbe937cebd09

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9deb4f8719c1ef13942f537d26c2a6580f7efbd84d7d03c19ae762d7dee15aba
MD5 6aaaa4f6b8c28a58432352e9ae3fc6b6
BLAKE2b-256 e5ba98d69779840c1807783e42a1c6d2fa4da53adae16f6dc04ade42c8c4a44b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.2 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.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 79d195f0f9002832910484c44ab2fa46004bef243d2a74006d109308ad3c54d1
MD5 f36649e21171b96d9ba1841f9cd0a93e
BLAKE2b-256 d8586439aa4c0d4b352dc4fba0f2afccd255ef1a7deee12415aec1a19f4e79f6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp38-cp38-win32.whl
  • Upload date:
  • Size: 62.9 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.0-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 1de38b27c9172a980fc2aff6ec390c6acb58d13f2dc14f321747f0ba87a9a329
MD5 ec4f6365736a7c5f35407f694a05ae05
BLAKE2b-256 e8157f5e778339186eea52e498eecf829d30dfdf1c2855b4b02a53175b8b74d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7d51fd2a8d278b87e185ff7399168c3a1a83e7889fe01903792cb224d0d5641b
MD5 1d358f7c74e3af355a64ca1ef549f9b2
BLAKE2b-256 bef6fdd9c8f4be305a7b88db01fc8178a91ef109ac1df5fd2fbb0980552f5152

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 cd9289f9341044f87e440ff5bbb24f6a203dcc9a1a1b24adc6d6d7fadd886d93
MD5 94dc9c4fd8fefb4cfd5988349cb92a4a
BLAKE2b-256 3df7133b7b540ad98da8c304ef31e7e84ca8eb7d773a4959fc6f9d4ad58ab20f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9f99c2e7fa629267bb241599bac6a8903b6291c21900b82f73849b7949709c1d
MD5 11bdf442f10255fd69e964da3e2003e3
BLAKE2b-256 accac601c4e803e2ee5fb184bd58ea6e9c8cb714230a85cca4da52818eba8879

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 67878fb7789222ef3c6be9fe501cb5a55625287c7eec8dcd6389ce9d7d79b6ff
MD5 45e6088fbdbb1b91990d2f3afffeafab
BLAKE2b-256 623e086530b580d816917c9fe4021d1b76a2fac91e64a99fcc816d5cf50ea5e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2079b0ccffdbb72501e9f1621539db5f45501788b44afd41eb68fc68bb5a4921
MD5 a0e543c6cc66a56499de613151b0d849
BLAKE2b-256 0e72fdbbd3671d11a3d83ee61dce346ac3c31fb4e39a43d530497bf25580094f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 65.2 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.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 5449bb83dbed84fb9104fb385e3905f4e71cf8f1e7bbb2b6ab6b011af5e1f4fd
MD5 ed45114bd0337a72b57e438fada60213
BLAKE2b-256 ecf106ca3e27b18769545d09ee98012d707bf321fa65548518c1e241c55419c2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.0-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 62.8 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.0-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 1c825fa9a6d3b4154748608d9f9a4216a6fb3190c06f72d52a6372745a321a12
MD5 ed798c3ff7444535574394999e486c18
BLAKE2b-256 32ebd8b46b58938cca6e2182d9b276de0caf092b3ef2df47d9b2adb6ba44b351

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 1486e03250e69b972ce4718b4a1230695a3d2c6866e2444b2baaba6084a6fd34
MD5 e6ea4a8df4eeac3559b4e784df7f4c71
BLAKE2b-256 f165e2a9b0519d9ca7a75250fb2ec9eb96933c4fee059d63e24fde38655b2d1a

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 341bfaa5eabdc1e86cb7f7cd2c76a26d72c125250bb8a9d917c9c4b1eaf590d1
MD5 6b18d82830e45f1e5a314db6ff877665
BLAKE2b-256 2f21926b33b652fa177e790477cf2fc469a526bedd4730c634da06c48da2780d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 10b846355fa74da0976e7ffa8ba89ad0a76857960f8de256628f8da76259bacc
MD5 8df150d343e78a438e01570101edba66
BLAKE2b-256 18a47e684d3dd965ebd705ac4e38597e526304ffbcebb07ea5bf971c78c6584a

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b6aa06f7a399e6ddf6a039039e65acaf037d82442c4bd5543f885a11edc25851
MD5 52975fc5f84c40107aabfe2e59722f8c
BLAKE2b-256 d6d2886c5e48c97f745eee8e3ea93f7118d1806c645ae41ac7222499f407de31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 984b73a984685508b7097e98337cf42c5334942fff56cbdac4cccadd396e60bb
MD5 d25be8bf5aba98f47897c71df97be211
BLAKE2b-256 d0c4dd85433d93f409b4c62bcfa927cbc0a8a60f0564e4480f57a7d1b2b61a00

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