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

Uploaded Source

Built Distributions

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

Uploaded PyPy Windows x86-64

zfex-1.5.8.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64.1 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.7 kB view details)

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

zfex-1.5.8.1-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.1-pp37-pypy37_pp73-win_amd64.whl (65.7 kB view details)

Uploaded PyPy Windows x86-64

zfex-1.5.8.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (64.1 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.7 kB view details)

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

zfex-1.5.8.1-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.1-cp310-cp310-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 Windows x86

zfex-1.5.8.1-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.1-cp310-cp310-musllinux_1_1_i686.whl (89.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

zfex-1.5.8.1-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.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.7 kB view details)

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

zfex-1.5.8.1-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.1-cp39-cp39-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 Windows x86

zfex-1.5.8.1-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.1-cp39-cp39-musllinux_1_1_i686.whl (88.7 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

zfex-1.5.8.1-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.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.5 kB view details)

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

zfex-1.5.8.1-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.1-cp38-cp38-win_amd64.whl (65.7 kB view details)

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 Windows x86

zfex-1.5.8.1-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.1-cp38-cp38-musllinux_1_1_i686.whl (88.6 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

zfex-1.5.8.1-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.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.9 kB view details)

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

zfex-1.5.8.1-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.1-cp37-cp37m-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

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

Uploaded CPython 3.7m Windows x86

zfex-1.5.8.1-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.1-cp37-cp37m-musllinux_1_1_i686.whl (88.3 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

zfex-1.5.8.1-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.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (84.5 kB view details)

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

zfex-1.5.8.1-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.1-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.1-cp36-cp36m-musllinux_1_1_i686.whl (87.4 kB view details)

Uploaded CPython 3.6m musllinux: musl 1.1+ i686

zfex-1.5.8.1-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

zfex-1.5.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (84.5 kB view details)

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

File details

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

File metadata

  • Download URL: zfex-1.5.8.1.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.1.tar.gz
Algorithm Hash digest
SHA256 7147c1818ccc5fec1e8e1f0f3c7a2dabdfd948677249efd664fc643a10af5790
MD5 9b5fcec95eb81136fd2eaf14beb6d2c3
BLAKE2b-256 3d449ea198958d891312aba2d3dca098cf516dc0a14541774e8b4b96c4a35ce9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 efd1b0d86aba82f5d37ca328814b96f541c977a061b15d24b145d4767bdfce41
MD5 3d831860efb9c8100ce34601d776e747
BLAKE2b-256 23c1404ac642841d98f0c51772093486ca0f13dc8213531e02d8f56d8772229b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 dc49a4d9f4590652dd4c75b87bad3c16625e88223d2759ce973110169f5f3fb3
MD5 628be03f04177770a152fe39bffba8bd
BLAKE2b-256 36afecba7905a3369f763b952cc4c72da8e36a892eb2b06b17c62ed6671c3212

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ba9fcccbc839d5462e34a78d1818df022afbf9febd9d62755839b7682156c2e0
MD5 afafdf52701f4d7e9dfb9f8d15a9837e
BLAKE2b-256 b3931e3750a8f78731686121f778aea74dda09759de262448bcaaf37cd48c74c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 03cbbf9bf505cdc35e8c71b2f92c9c367fbabb210e2295f13459a4383a07d968
MD5 8e6f6289c000da0b76bd1c30191eda48
BLAKE2b-256 b4c1d6473ac7fd23d415045a205d54faa6bab5cedb303c7fe41dc9bfc74d1c74

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 719f8c329a516296a41de78c9cde7e94c350d987ad345f6be63b1a799a0d315d
MD5 daeccaa4688612ffd0628292621e126a
BLAKE2b-256 0508b5cbb9525ce0796ca11f0a02a20d69ed2542dbc03af3f3bafaf98a6a3f93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9cd951d3262a4d292e4397ae5835dac30692f28ca6143f8ccb3edac4286673a2
MD5 4eaed2609d4c0760a5b8d37fcf1789fb
BLAKE2b-256 faee26847722c350d5115f122d58549d7b439205439221d437acaf89b52027ad

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 62979cc116da3e84e99e3c173ebf0a45a55d76b2d1441afc0c250a2c94f478ff
MD5 e693d55b18c93ec3f7d3d5f76de51553
BLAKE2b-256 7b06c5ffef819ac65e99bca384491bf6edcea2e39213300da1aa74a88dc0779c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2ae4d8b93e5337c3cb98be3d5c84f8cda93c2d15c4c7b3b1a9bb2b28b82abb4d
MD5 5914e8dc4fb20c53d5e7b5841a0de8a4
BLAKE2b-256 84566158765e124025e4cce703c0e11c94fd000fe74cb930cd980272512e661e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4a6491824a4a5f832a05f00e8783ec9a7db35c7398097bd9798b197f57e89dc7
MD5 bbe961bc0128944556196fabb9e0042f
BLAKE2b-256 7cf4cdbbe291a82f59113a90094d30bf0624a9cece2444b09a00c4db95a4e2ac

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 2bbf8b49f0f77b84eef91dc3c1c2f3c0df9b9871cf117e098a053cc4950ab3ac
MD5 36f1a8d149073985e8df6f28111d8762
BLAKE2b-256 cb064cd6acdc6c296ecb93a0c1c3d8dc2f5a402912d7dd84ceba4a6396427093

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 4f56521810d7ea33986a47d42f2fcdc3dbcf4ab6f5d12ada0e09e95fa89dbcc8
MD5 24735b0b210b3ff06ff666dc4d861238
BLAKE2b-256 47cfd4f35ae3049a006e592d62e75ccb5205b8fd6f1b11314008e2c3c5763473

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 59733bf87f018ebbdea77e4bdf671aa3367ffd8313f3083fa40f4ba3cbb60987
MD5 387440e3f268c198ab957b0547e01fcc
BLAKE2b-256 9568e6c762f3f688206f19286b6e72f9ac6777d48429f95abb48692921fb17db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4db38132028343fe85a88c7f9a6a2b475e998819c8526ab172748f0137fd0620
MD5 b5b378db2f3217c6efc58ac749a95634
BLAKE2b-256 b15df3f8529eec7ed4a7ff0ee25f33f7bba26d7c1f7f3f051f2d48ffd1b606b5

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a80704ea46fed51f17254c5db5ee3b3c45b98227baea749d24ea99758db937e4
MD5 6606836dfb7682930bcc260dbfd259d8
BLAKE2b-256 1916b0702be824eef83b11bb06e4496967bb35470ab696d8c0d89dd97cd58448

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 12f3950af342acf71d261cfcabe1e4ade66d9f7becb3f8ab2cc2e4d12e46c9cd
MD5 5ddfab3cdfb3f8ceae1c6df8406d515c
BLAKE2b-256 480bbd28401a769a94c4dd88f6b2fbb85021d576ecce6b55be4ee514444217ba

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 77a41d7da9b127e6bc9073ccca7615931bd79feee6b001da28d18928bc1c8d7d
MD5 cc95b725d991112b353148676dc3c626
BLAKE2b-256 8ad1c3c4a5443c4895d6c1a4c44d666b347ebf297ac2fd6658bce151f566aba1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 15a2a170fa77b5a57eac62bf89453342ff9170d526b2fba21301b4db0039c6b4
MD5 7f7c29a2e2406d87576919c2edfe10f5
BLAKE2b-256 740fd94c6725eed54417742debcbd26e2f2be9b50398ef4cf6943d2b65116b81

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 afa6d6f76f3111153cfdfffa9a3f1524a26a29e400c64b76ad34f3bbb7dd14e1
MD5 ecd9744a9da3d73df81f4f2b03bc7b97
BLAKE2b-256 a04582f833ad7f5294e7fff1fb7df71be79eb1063b92c8cbd3ce63fa53341503

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 10cea10a9eb18621f312ac685d149af5adcc0eba776fe94698feb0b39d4aa568
MD5 e861b835b8065be99212f7ca55594b43
BLAKE2b-256 a1559ab66261513dc984c524bc6f1dda44790a655a9294dfd7b3db81c135e43d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ab7864078e18d9fc1b88cdef30afc2e0131b9c465323a91b7ab47ccdb83117f0
MD5 5a2f209043e5fe5be311611a8294a376
BLAKE2b-256 bc80c981afbab25473941d2ae5064e89f666afaa7bc216ef06d0c06a5310ecb7

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 daae0a0269f085405b753f6f2d7130164853e2ef07f51a90bee7db11f586447a
MD5 59884cb2509242ecf1046dd5f6e62b6f
BLAKE2b-256 ec48f2bf49ef008d15ec48c2549800d44949208b0168b814905e6a16e23bdb55

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5aec901602bfe613f87582ca0d33a1da895381c651f2a24daa042df7434f6710
MD5 a3d3faf05bfce591099abc6ada7bb6a9
BLAKE2b-256 7817bd175c1a72bdfa312f3b1994c8fd1bdcd7182e6f418faa2ea951149e7e2f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 cd36b4c62ff353afdbe3a20a49d428bd7221d56fe13ca6388dec92af9b3e0925
MD5 c3bc4394abae7064ba195b329004e09e
BLAKE2b-256 68dcbf4a85ad12781d135f98f32407289c90d7c46658e46ae1305a50ad8b2a6f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 95a8d627ded225b341568092431a29dbbf82777535eb8d1db964bbb21b8b5c73
MD5 6f97689903b0c00eedc841cf3d69d1bb
BLAKE2b-256 37d3562a98a70ba1bf01e501927c1cc5ee7b78b9f501f9d605bc2b6bb758d1b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7d3c77c584799e9b14655885ecf72835ac6218e9705894b31e9918f4767f27ab
MD5 3047fefe3f648b4cc0e5c62595725388
BLAKE2b-256 7ff2a6819a703a55bd211f27fe2f4047360d692a6abcaebfe07bbc7625c1e639

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 f5df305920bc23f6ad54c57fb4a4eea7b4e7875ecaf77193095e8f216768e894
MD5 c3cda3aee3fe363453c3ce85bc55cd60
BLAKE2b-256 efa5fcd59733ab3638dcbe47cc021a52620e6535732e827c6430783276c4db85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3b956913dff138050cbfe82283ade6d0974a942a77c30acbd4aca33555d07a53
MD5 f64319f2eaabe2985d9ac8256b3c3fbc
BLAKE2b-256 41598926e66ef81ffbe2ab515d14bcb4e56e5f7e4d3e305b22a66308ee37541d

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5c56873294c9bfcf28f1bcd0ae9483451cf22e67a69448d08e3fb9ac502e65d1
MD5 2010b557f641bedddbf00a6692a1dee6
BLAKE2b-256 452e654e0cc48d1e56c80c132f70d0fc8c4deb2f08f9417174445d549e648d80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 65a268641ff94b5c0ff28fd4c613b4b5e4703c3b4d715a03d3e1ca3cb95b2d5e
MD5 9b00ab532939e11ea304b6a2f1aa8264
BLAKE2b-256 b1485b337ddc537b9034153ae745b12abb126906ba1f9f7a1195104ff808355a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 00995b3b366c85f85da0906b99313b633cbc7a0355bf9b270b8003782c3d6746
MD5 90ce540983497b46266a797f78879551
BLAKE2b-256 adf7b89cc0cc74fac8eb0864174789cc4b206d7f55c22c72bf0ea6606a526877

See more details on using hashes here.

File details

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

File metadata

  • Download URL: zfex-1.5.8.1-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.1-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 52d760eb46f72336c61467baf9c3c65219b2e1cd778851d096c93251f140ea07
MD5 dc168fb5240e37c09a2a026730a7fd89
BLAKE2b-256 c9bc288d5e0503b402a9d7fc68e040e561150e347003d5ab3de25fa7da19e0dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ad65215e6b9015b38c7217f958e2fef977d1fb6bfc670955b1af6cfc1e9b3774
MD5 708bd7f0bb7a7a7b93078526fcc67161
BLAKE2b-256 0994f917ab068179a5b836a1f1bb72020c988ab33590bb863d7e7287ec14cc68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 806ec14a2cf471d09fb784c1b5c9058128840c2a131dd54a5f7e0cc42864ef4e
MD5 eb4c8557c9037374e4c542446ea32eb7
BLAKE2b-256 c098512cb2a4004152193e5736446b4582f762644b081a48bfb9b4e05eb9c246

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d4b9b66f95a8aeef3bfade168585a8b3ff65948a4658a73f53221393d40f1f0
MD5 441bc3416c13c5d4312a081339d72485
BLAKE2b-256 8eafdc40b1053699f8423443d9031ce63f5e2db04805c5a27b33dbcbdc14ad57

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-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.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d967bfbb6f5cd1564f89563fd4b728c7acb3f03fb9ea4c4ff7b4ad735eca9cac
MD5 6a4b803903e8ecd4975c7ee90d164e77
BLAKE2b-256 1489cb95f822c8e7b9a8b338e21e43c5daecbd471da4c4968977b0bd9d5a69af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 60bd37be3f52b2529f5579138342699a189289b70411079c79ebc82973c3d667
MD5 343978ad6d1358fc733c5df89ff38f07
BLAKE2b-256 a58fcb42234a5bb672f09b18b1e1cca921da96e9a6d7e825bb3b27e438cd27de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 8d41830879befdeb6179b18f099e83905c4f5ded873ca091c65f6ef18e190125
MD5 77780d9d514270d92a55b976dfc5285e
BLAKE2b-256 1c311bc5025716d9a183d119776f2f00acce20ad13c96146b5f114a238d27757

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-cp36-cp36m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp36-cp36m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 9abec2c6afe211d17b89891eed990bf5c667696aac73cefc3bee2ebd61e01db2
MD5 e32a717bbaece42c2e3151984d2eb69d
BLAKE2b-256 4d52f3ce860c9b672969ad0eb5c87d4ed79ee5da7dd3eec93d5d52485ad69ccc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3c0f25f6ee40c3f30a3e990c82e536b8dd3886b2b6a22dcae30cfbc1064f625
MD5 60b56293f5edc528c5dcf3df26debe45
BLAKE2b-256 487514cea46661bcff1eb8208b93ce0a4b2bc3a896cd45262bd4d4df53071050

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d7c468d7090275f036f585310304b6946f65b35b8d1cc4f14180b212d732130e
MD5 5ba484ee9646c42a4581e6a0b0532c1c
BLAKE2b-256 c2148f58c675220fd21776d5c2c4fee378b0df3b05e2bbd5ef43461e9f89c0d7

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