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

Uploaded Source

Built Distributions

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

Uploaded PyPy Windows x86-64

zfex-1.5.8.dev1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (63.8 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.dev1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.4 kB view details)

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

zfex-1.5.8.dev1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (61.9 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded PyPy Windows x86-64

zfex-1.5.8.dev1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (63.8 kB view details)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

zfex-1.5.8.dev1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (63.4 kB view details)

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

zfex-1.5.8.dev1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (61.9 kB view details)

Uploaded PyPy macOS 10.9+ x86-64

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

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 Windows x86

zfex-1.5.8.dev1-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.dev1-cp310-cp310-musllinux_1_1_i686.whl (88.6 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

zfex-1.5.8.dev1-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.dev1-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.dev1-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.dev1-cp39-cp39-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.9 Windows x86-64

zfex-1.5.8.dev1-cp39-cp39-win32.whl (63.0 kB view details)

Uploaded CPython 3.9 Windows x86

zfex-1.5.8.dev1-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.dev1-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.dev1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (88.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

zfex-1.5.8.dev1-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.dev1-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.dev1-cp38-cp38-win_amd64.whl (65.3 kB view details)

Uploaded CPython 3.8 Windows x86-64

zfex-1.5.8.dev1-cp38-cp38-win32.whl (63.0 kB view details)

Uploaded CPython 3.8 Windows x86

zfex-1.5.8.dev1-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.dev1-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.dev1-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.dev1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (85.5 kB view details)

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

zfex-1.5.8.dev1-cp38-cp38-macosx_10_9_x86_64.whl (62.4 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

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

Uploaded CPython 3.7m Windows x86-64

zfex-1.5.8.dev1-cp37-cp37m-win32.whl (62.9 kB view details)

Uploaded CPython 3.7m Windows x86

zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_x86_64.whl (92.9 kB view details)

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

zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_i686.whl (88.0 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

zfex-1.5.8.dev1-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.dev1-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.dev1-cp37-cp37m-macosx_10_9_x86_64.whl (62.3 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

File details

Details for the file zfex-1.5.8.dev1.tar.gz.

File metadata

  • Download URL: zfex-1.5.8.dev1.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.dev1.tar.gz
Algorithm Hash digest
SHA256 031843a89b5045fd03734408d366448f893eb7e7df9a25f4de453003e3e563d3
MD5 ded2499ec5286681da1919734b88b070
BLAKE2b-256 de3ea8f5709a2f72a54c0c69ffe71391a326e1949956bcbefd25d815da748548

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-pp38-pypy38_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 e77465cd0c9f5c9a92d263e2ab048bc099cd409dbaae661ef1ec3e8505ca1255
MD5 4df44c906e65d8fea6d247180c6dff2b
BLAKE2b-256 33d0ea331b4fa9d8b8ddefc19275c7c7bad071f279668d7408978e24f532d95e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7a0f68330e74afcfe572517bb6b1f9888544757d8cfe7c99c791b862c8236ffc
MD5 70c9edeaaf4ebb2c7216be2f4041603d
BLAKE2b-256 c3aeb1988fd686265320fdcffc995514db27b573fc15265bd3068359688deaf0

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 aacd1c5e6e74ef7d152d42e8b0b1f29e7541316c7e3615d6ae05e070cd40dff9
MD5 0a73d1c008f5d29a600d2f56a6c698c8
BLAKE2b-256 d51578df2e8a4641d083f8b6dc03f92b462a6f243ff842e45d3ea5bd5d0bfa83

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 692237d6eea47aaf4cf4fe34f261846384c0b2dd90a73cb8e0e05327155cd0a9
MD5 c467aa4effd142037fcad90ed74eec00
BLAKE2b-256 d0b6f6b9f99fc55c87e75198da9916f705e5e9ea32d0321ac91758ef0af47a9c

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 33f93594fff8288e564bbe3fb89de66440c595822a474a0756bcb5bafc6b8971
MD5 a8e39ae8522844874d75209eb5834ca7
BLAKE2b-256 fc7fb241f81ebdc2ca2b1b49949a1c195f14cd366204a674b5b7f9cc7a5b2498

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 767246a55c78c9525f1eccdf566d263198b2c8403d42e6184b687780c72b9d42
MD5 9a5099f847d18fa58b8cfeec8a69c0cb
BLAKE2b-256 4b138e4a78d59f8cc3065dc1759ea2e38b7fd18500a2f0de490576ea67bdabc7

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6dc6e748d0907752bfa8fead26e0a3490111ff3d14321697e8fa87620498a796
MD5 680fa590eb2653cc1780bb9ff5d48894
BLAKE2b-256 fa705067985e23fd028e7002abf29eb0ed75d1c017bed685f5f893fdd4a70326

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b887fa52d189d6c75011ea5b6304f7652e311395eb4591d5c27e77d4bd0d93b8
MD5 428c9867acc277959adb0f3bcc3ddb0e
BLAKE2b-256 cd36e9a599c3d49b6fca5d122237513fa20039818e2b8745a184cecbbb7f1f47

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 af21b5e3c44efd32071991d5367b4776a9ef9eeb64d1c104ce798a24ba63417b
MD5 05880f8a606e5f43c367ae89f928ea4b
BLAKE2b-256 60c8c46319b2c49737cd4f31fe094ceeb71ba4fb428be65eab184f54a8611647

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-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.dev1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 f61e9e74fbe2d85671b0117582fbb309831ed1c855e11609c5d89d2b4a41b89f
MD5 d3ee4463ae61704272980e76ca3ee269
BLAKE2b-256 9d4b10dae9ac80d4bb4bb9de2fe41cb9bfe8cba1e45d5bf48e710c72d112adc6

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 99fa3b8737c2501121acea87461183f250c2c42bc2d795ddf936fac6b9e1ec20
MD5 da6ce523cf2201054dfdf16cdac9ab4b
BLAKE2b-256 9d4eb2b11fbde7b34fe12330b82dc6b26323b6812133fe71930dc930b12c1f5b

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 41a2bec199cc3702a630fc676f615c823dc47f3ddb7ea2c3b0acbe636074abb3
MD5 83e8a16bdb370173258e3f4772de442c
BLAKE2b-256 2c0df3aa71d4aa691305878cb1c4cf58f962b493a807db85864b81292e9ddc0b

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 acb4b8814f4faec41cc813332c42d2a64160fd12edd0ec4a251f118550a5d2ff
MD5 af1c591baf4ac4f0d03c3cd8c3cd5e52
BLAKE2b-256 73234cd78320d130da8e57d4c991fb350eefaeb44ba3cc336a4079e6a0c4bfee

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 c54985b985aad19c06d1e2cbadd28df76d988562f8c6024f1c7948768a6c89fb
MD5 4fa1ce12d4ff46f762ae08666fc7194b
BLAKE2b-256 120e1bda74aebb254535438f7448ab570ecd32cf48893898cd7aecc71221eba6

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6f580c208a8bf11fcd346141f357567d966fd6143debb762f7b659ba2006dec5
MD5 2bd6f8b32f692ca9656b7d35ae9218c3
BLAKE2b-256 0849a90bc2560bf04e23a30709dfbca54d6245f2dcf9c22b4f7d6d84619a8fc9

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-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.dev1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 eacd8342c91a2a0a384aaefaa49e13b4d44b052919e73e765a396bcb27effd83
MD5 a755718d697fa2dfa0c21c4f76a491bd
BLAKE2b-256 347a05a8c4dafae4a537af094b2e4cb79c11ad3fc7acf9f6375e64bdf7553d19

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-cp39-cp39-win32.whl
  • Upload date:
  • Size: 63.0 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.dev1-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 be7b1f4d40c4eb594168391bc115a09b960731b815f1b1cd557c928d09e0b4f4
MD5 362cc9eeebd396f08b268a4554cd21df
BLAKE2b-256 55751617d26878c71dcd63a3e03bf5aad94b72429e1eb3325c990b23b68373bc

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 b8d982a9f59a1a27738ce3f039bad5e73b26ee3669eac80e6b0688f10956e010
MD5 8fa1bda45d9bfce1b66238d8b1dd8d1a
BLAKE2b-256 b05509fdd298f77a8a339832e5e66e215373aa0f730a5a1f65ab370eff488aae

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 944a8cc0e5db6fd87abf37ce2549df524422d181e13d2d05f943e5688fcd50ed
MD5 9b5ec37cec97ff805b91c7d825ffd1e0
BLAKE2b-256 416cd4a5dc3738cfb66c9dae320c92499aa35ba9ae1610f2df1c03695b497de3

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b2ecb5987ff8e6fd3d138e3864ae3405dea0624422b2bbe2d6cd1f874dcd30f9
MD5 6a08a58141836448448e3842de9da965
BLAKE2b-256 a240e47a532f54e51e5246a76263fb767bd2cbd0cc5d07fdd71a0c8be446c99c

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 44bd0e0db31fb2a75858a32f530d153750fafcf8cef79337be5c2c1c8504d9e3
MD5 eadd24550fd28c8909738597df43b7b1
BLAKE2b-256 5c4237b16f244317ef58c858c0d64d5129ba4631a75ce861c1b6ac77c71a94cd

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 de09510029b0300354412f025da1aa70546dad2ebcbe0ee707a4b20493e63189
MD5 bcf81fa0ebdd24c47ebd9c48c66e97ae
BLAKE2b-256 e4a2820d0238106c145d7eb39e1f332343223d428f97e34bfad8a4a539a6b14e

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.3 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.dev1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 87fc08b3ced90f9a74bda322029f579cff9427a934998e2fe8c7fcda34158214
MD5 3aa50d9e4c647f67cc11c52ebd89df68
BLAKE2b-256 369d26c89a39ff4ff3706b1ef64cc461750a0cc16e659ef51735d250e92c3d2a

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-cp38-cp38-win32.whl
  • Upload date:
  • Size: 63.0 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.dev1-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 9b9a82a89d2c50cd113f99218ce795a0a59591a12d1596dccbbef48d8ae5e88f
MD5 dca2f66370dcaa784b8af24f50c7387a
BLAKE2b-256 25bef6cca477f1b8ec5e5ad27f68291fbe4cc6e8a265b1cdefe70b47ef02f1c2

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 b057426173244ef2fa7fbdf83134cf9a238a7f7f4fd0e4b42de9902203a77ab0
MD5 3de84ee12738b81efb456b50f75e14cc
BLAKE2b-256 48ba3e79f05f9c369032b9e2a111018b80915efd51105d0167e1f11d117cfbda

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 77fa4896076cd711dd69246aea90d404dc4d33246af2440bbc81d4151298c5c4
MD5 bf757ebd06fd250aae72ea88d559a5de
BLAKE2b-256 2e857a8164b7f323d09e79dfa9a3409fe432a3a33ec3bf8c145b4f7ee89ced2a

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7fff7c40451adc1835d787c24cb83aa10ce7575c8acd38ae91bac661ccde052f
MD5 1eaa28f99d3cad22b4fd30f0f254a46c
BLAKE2b-256 face474b154b09cae5f42a274320d9737c09c3b7889d912e345540c2b12504f6

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 78fc40a91148838cfbb25169babab88a7141b5f9f01ceb034522a2111a41d703
MD5 0f87c43d53f2293b77be77d9425983e9
BLAKE2b-256 a7eb797339f897fbbe5218bd6a28cbc9975de57e559af732e7addef4d87ea879

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 034c325a33cc8a53a831b9f7442360c8f15fd6b154b3a2bd3df5c0624af8c0e8
MD5 304120286dedb2f45bceb576cfb8f901
BLAKE2b-256 eea8910998db9a64829becac4929f4d2c0a828aa1168810dfeeec2e3b0444940

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-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.dev1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 f1b32c45fb9a8562845cf1eb851adbfa339c1bc8a35631358c6ee2451e00c111
MD5 7fac20e25ccd67d467df46780acb02d7
BLAKE2b-256 146aed4e917a693f93cd7dcf687fc36d7be7e3b4618359a0b0f90e0bba2c0ad6

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp37-cp37m-win32.whl.

File metadata

  • Download URL: zfex-1.5.8.dev1-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 62.9 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.dev1-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 2a9cae08bcb05e095eeb2971e2477505c0e0c1c2d237406e5b089f50256b9f0f
MD5 4b3664f29cfd6ec1b132b689a95952b1
BLAKE2b-256 3eaa19d711e342cb85b025241795fef322b90fdb77bfa307412792c1a3bef1a7

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7cb9b8921fa7c048e1a52bac2c2ac3b9dd97dfa2a706a30efdc9f9424bf5a08f
MD5 f0d6d3ab07ede8bfb368cc76f197b76e
BLAKE2b-256 a86ecd62e38c9556dcad149fc41de87dd678ff081f4ba529fec39b740611549b

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 de14b0b624acf2382cda1c14c6295bbf6ad1f00f154dbe186b2cf4eda535a971
MD5 3ca51f97694f5596789783488526da3f
BLAKE2b-256 e8e1630268641ae6822d158ef8ecb3f2de5e68cd4c8c1e2b820fd3eab54b1333

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6da2d2e2a950bf09fe4a7113271b16338b4fbf35e7de32e8047461d7068e010b
MD5 afc400b4d80ba4cd3945c2b0c23ebde3
BLAKE2b-256 0fe4d8bb61641852f03c9262d0dd6ca610b095d6b2abdf6b9c20c85a3e0cc508

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-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.dev1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 de8c28871932fd276a66864941d35bf68fbbdc7e2fd1d22daa47eb7622f34826
MD5 4e1a5bf0cfd190efab675ceb4ee61292
BLAKE2b-256 26bd795830b5c66964f45eeebc8537342b29fdad23e884f856294404bbea888b

See more details on using hashes here.

File details

Details for the file zfex-1.5.8.dev1-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for zfex-1.5.8.dev1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 78c6154b777fa5d9fb119da91d786983f3bd0165e3b245712d14245be3a58660
MD5 531519fcbbed8fb1fb3dbd93fa9a808e
BLAKE2b-256 103e626cbe3b2bb72d7d33bc12aa7001ad3a9aedfd799bbf73d8e3fb7fde6a74

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