Skip to main content

High-speed PII masking as a Polars plugin — powered by Rust

Project description

MaskOps

CI PyPI Downloads License: MPL-2.0 Docs

High-speed PII masking for Polars — powered by Rust. GDPR-compliant asterisk masking and FF3-1 format-preserving encryption for EU and Latin American PII.

MaskOps extends Polars with zero-overhead PII detection and masking expressions. No NLP models. No intermediate files. Just regex + Rust running directly on Arrow buffers.

Contents

Documentation

Full docs, regulatory coverage, and pricing plans: fcarvajalbrown.github.io/MaskOps

MaskOps is also listed in awesome-polars under Security / Privacy.

Install

pip install maskops

v1.0.0+ API stability guarantee — no breaking changes to mask_pii, contains_pii, or mask_pii_fpe signatures without a major version bump.

Usage

import polars as pl
import maskops

df = pl.read_csv("payments.csv")

# Mask all PII in a column
df.with_columns(maskops.mask_pii("notes"))

# Filter rows that contain PII
df.filter(maskops.contains_pii("free_text"))

Supported patterns

Pattern Example input Masked output
IBAN DE89370400440532013000 DE89******************
EU VAT DE123456789 DE*********
Email john.doe@example.com ********@example.com
Phone +14155552671 +1**********
IP Address 192.168.1.100 192.168.*.*
RUT (Chile) 76.354.771-K **********-K
CPF (Brazil) 529.982.247-25 *********-25
CURP (Mexico) BADD110313HCMLNS09 ******************
DNI (Spain) 12345678Z ********Z
NIE (Spain) X1234567L ********L
NIN (UK) AB 12 34 56 C *********** C
Personalausweis (Germany) T220001293 **********
Credit Card (Visa/MC/Amex/Discover/Maestro) 4111111111111111 411111******1111

Tested against 8 EU locales: DE, FR, ES, IT, NL, PL, PT, SE. Email and phone follow RFC 5322 and E.164 respectively. RUT and CPF include Módulo 11 check digit validation. DNI and NIE include modulo 23 check letter validation. Credit cards include Luhn validation — format-only matches are rejected. Personalausweis: weighted-sum check digit (weights [7,3,1] cyclic, mod 10). NIN: HMRC-excluded prefix validation (BG, GB, KN, NK, NT, TN, ZZ rejected).

How It Works

flowchart TD
    IN["Python · Polars DataFrame"]

    subgraph API ["  Polars Expression API  "]
        direction LR
        MP["mask_pii"]
        CP["contains_pii"]
        FP["mask_pii_fpe"]
    end

    RUST["Rust Core — Arrow buffers · zero-copy"]

    subgraph MODES ["  Masking modes  "]
        direction LR
        AST["Asterisk\nirreversible"]
        ENC["FF3-1 FPE\npseudonymization"]
    end

    OUT["Masked Polars Series"]

    IN --> API --> RUST --> MODES --> OUT

    style IN   fill:#0d1117,stroke:#3DDB81,color:#e6edf3
    style RUST fill:#0d1117,stroke:#CE422B,color:#e6edf3
    style OUT  fill:#0d1117,stroke:#3DDB81,color:#e6edf3
    style AST  fill:#0d1117,stroke:#4e8adb,color:#e6edf3
    style ENC  fill:#0d1117,stroke:#9f6fcf,color:#e6edf3
    style MP   fill:#0d1117,stroke:#3c4450,color:#8b949e
    style CP   fill:#0d1117,stroke:#3c4450,color:#8b949e
    style FP   fill:#0d1117,stroke:#3c4450,color:#8b949e

No Python objects created per row. No NLP model loaded. No intermediate files.

  • Presidio is heavy — it spins up NLP models for structured CSV data that doesn't need them.
  • Pure Python regex on large DataFrames is slow.
  • MaskOps compiles to a native .so that Polars calls directly — same speed as built-in expressions.

Architecture

maskops/
├── Cargo.toml               # Rust dependencies
├── pyproject.toml           # maturin build backend + PyPI metadata
├── src/
│   ├── lib.rs               # Polars expression registration (mask_pii, contains_pii, mask_pii_fpe)
│   └── patterns/
│       ├── mod.rs           # mask_all(), mask_all_fpe(), contains_any_pii() aggregators
│       ├── eu/
│       │   ├── iban.rs      # IBAN regex + masking
│       │   ├── vat.rs       # EU VAT regex + masking
│       │   └── european_id.rs # DNI/NIE (Spain), NIN (UK), Personalausweis (Germany)
│       ├── latam/
│       │   └── latam_id.rs  # RUT (Chile), CPF (Brazil), CURP (Mexico) + FPE
│       ├── contact/
│       │   ├── email.rs     # Email regex + masking (local part)
│       │   ├── phone.rs     # E.164 phone regex + masking + FPE
│       │   └── ip.rs        # IPv4/IPv6 regex + masking
│       ├── financial/
│       │   └── credit_card.rs # Visa, Mastercard, Amex, Discover, Maestro + Luhn + FPE
│       ├── fpe.rs           # FF3-1 AES-256 format-preserving encryption (NIST SP 800-38G Rev.1)
│       └── country_codes.rs # Country prefix lookup table
├── maskops/
│   └── __init__.py          # Python API (mask_pii, contains_pii, mask_pii_fpe)
├── benchmarks/
│   └── benchmark.py         # Per-family throughput benchmarks (1M rows)
└── tests/
    ├── test_masking.py      # pytest suite (246 tests)
    ├── generate_fixtures.py # Faker-based test data generator (5 fixture files)
    └── fixtures/            # Generated CSVs (gitignored)

The Rust layer operates directly on Arrow buffers — zero Python object overhead per row. Each PII type is its own module: adding a new pattern = new file + one line in mod.rs.

When to use MaskOps

Situation Recommended tool
Structured data with schema-defined PII columns (CSV, Parquet, database exports) MaskOps
Unstructured free text — need NER for names, places, organisations Presidio
Both structured columns + free-text fields in the same pipeline MaskOps + Presidio
Reversible pseudonymization required (GDPR Art. 4(5)) MaskOps (mask_pii_fpe)
Air-gapped or offline environment MaskOps — no network calls, ever

contains_pii is useful as a pre-filter: scan cheaply first, then mask only flagged rows.

Benchmarks

Tested on 1,000,000 rows, Intel i-series CPU, Python 3.14, Windows.

Median of 3 runs per benchmark. Baseline uses equivalent regex coverage to maskops per family.

Note on per-family benchmarks: maskops always runs the full pattern set — there is no per-family dispatch. A "Credit Card only" benchmark still pays for IBAN, VAT, email, phone, LatAm ID, and EU ID checks. The Python baseline only runs one regex. This is why maskops underperforms on isolated families with dense PII. The advantage emerges when all patterns are active simultaneously, which is the realistic production case.

EU patterns (IBAN, VAT, Email, Phone)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 2.455s 407,300 4.268s 1.7×
clean contains_pii 1.184s 844,846
dense mask_pii 3.184s 314,093 1.784s 0.6×
dense contains_pii 0.133s 7,497,325
mixed mask_pii 2.943s 339,774 1.993s 0.7×
mixed contains_pii 0.282s 3,551,833

LatAm patterns (RUT, CPF, CURP)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 2.276s 439,367 2.319s 1.0×
clean contains_pii 0.795s 1,258,169
dense mask_pii 3.048s 328,080 1.690s 0.6×
dense contains_pii 0.640s 1,562,313
mixed mask_pii 2.880s 347,173 1.854s 0.6×
mixed contains_pii 0.705s 1,418,784

RUT and CPF include Módulo 11 check digit validation per row — this is the cost of zero false positives.

Network patterns (IP)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 2.301s 434,502 2.093s 0.9×
clean contains_pii 0.799s 1,251,735
dense mask_pii 2.509s 398,628 1.553s 0.6×
dense contains_pii 0.215s 4,655,272
mixed mask_pii 2.504s 399,408 1.684s 0.7×
mixed contains_pii 0.374s 2,671,550

Credit card patterns (Visa, Mastercard, Amex, Discover, Maestro)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 2.243s 445,762 0.954s 0.4×
clean contains_pii 0.792s 1,261,873
dense mask_pii 2.797s 357,473 1.005s 0.4×
dense contains_pii 0.628s 1,591,805
mixed mask_pii 2.687s 372,166 1.014s 0.4×
mixed contains_pii 0.674s 1,484,572

Luhn validation runs per candidate match — this eliminates false positives at the cost of single-family throughput.

European ID patterns (DNI/NIE, NIN, Personalausweis)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 2.282s 438,149 1.410s 0.6×
clean contains_pii 0.801s 1,248,547
dense mask_pii 2.609s 383,334 1.107s 0.4×
dense contains_pii 0.604s 1,654,937
mixed mask_pii 2.590s 386,037 1.179s 0.5×
mixed contains_pii 0.665s 1,504,806

All patterns active

This is the realistic production workload — all 15 pattern types running simultaneously. maskops is up to 5.7× faster than an equivalent pure Python approach. contains_pii reaches 1.9M rows/s on mixed data — use it to pre-filter before masking in hot pipelines.

Profile Expression maskops Python re Speedup
clean mask_pii 2.344s 13.445s 5.7×
clean contains_pii 0.822s
dense mask_pii 3.269s 6.625s 2.0×
dense contains_pii 0.520s
mixed mask_pii 3.285s 6.581s 2.0×
mixed contains_pii 0.545s

maskops throughput stays roughly flat as pattern count grows — Python regex degrades with each additional pattern. The clean profile gap (5.7×) reflects Python's overhead of compiling and scanning a large combined regex on short-circuit misses.

vs Microsoft Presidio (measured)

Benchmarked on 10,000 rows of mixed real-world text (email, phone, IBAN, credit cards, IP), Python 3.11, Ubuntu, en_core_web_lg model. Extrapolated to 1M rows.

Tool Profile Time (10K rows) Rows/s Speedup
maskops clean 0.021s 479,441
Presidio (en_core_web_lg) clean 101.131s 99 4,849× slower
maskops dense 0.028s 351,645
Presidio (en_core_web_lg) dense 115.599s 87 4,065× slower
maskops mixed 0.028s 358,118
Presidio (en_core_web_lg) mixed 118.125s 85 4,230× slower

At Presidio's measured throughput of ~85–99 rows/s, processing 1M rows would take 2.8–3.3 hours. maskops processes the same 1M rows in under 3 seconds.

Entity coverage

Pattern maskops Presidio
IBAN
EU VAT
Email
Phone (E.164)
IP Address
Credit Card
RUT (Chile)
CPF (Brazil)
CURP (Mexico)
DNI/NIE (Spain)
NIN (UK)
Personalausweis (Germany)
Person names (NER)
Locations (NER)
Organisations (NER)

Presidio's strength is unstructured text with named entities (names, locations, organisations) — use it when NER is required. maskops is purpose-built for structured data pipelines where schema-defined PII fields don't need NLP. For mixed workloads, both tools can be combined: maskops for bulk structured columns, Presidio for free-text fields.

maskops is purpose-built for structured data pipelines where Presidio's NLP overhead is unnecessary.

Build from source

Windows (PowerShell)

python -m venv .venv
.venv\Scripts\activate
pip install maturin faker polars pytest
maturin develop --release
python tests/generate_fixtures.py
pytest tests/ -v

Linux / macOS

python -m venv .venv
source .venv/bin/activate
pip install maturin faker polars pytest
maturin develop --release
python tests/generate_fixtures.py
pytest tests/ -v

Key dependency versions

Package Version
pyo3 0.25
pyo3-polars 0.23
polars 0.46
maturin >=1.7,<2.0

Note: pyo3 must be 0.25 to match pyo3-polars 0.23. Do not bump pyo3 independently.

Roadmap

  • Email, phone patterns
  • IP address patterns
  • Latin American IDs (RUT, CPF, CURP)
  • European IDs (DNI/NIE Spain, NIN UK, Personalausweis Germany)
  • Credit cards (Visa, Mastercard, Amex, Discover, Maestro) with Luhn validation
  • PyPI publish via GitHub Actions
  • Check digit validation for Personalausweis (Germany) and NIN (UK)
  • Format-Preserving Encryption (FPE/FF3-1) for reversible masking
  • Benchmark vs Presidio
  • Parquet streaming support
  • extract_pii expression — returns a 31-field Struct column with the first match per PII family, enabling routing, reporting, and selective masking without re-scanning
  • Performance sweep — Opus 4.8 deep review: bug hunting across all 31 pattern modules, regex optimization, allocation reduction, rayon parallelism, and benchmark refresh targeting positive per-family speedups vs Python baseline

License

Mozilla Public License 2.0. Commercial use requires a separate license — see CLA.md or contact fcarvajalbrown@gmail.com.

Project details


Download files

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

Source Distribution

maskops-1.5.1.tar.gz (5.5 MB view details)

Uploaded Source

Built Distributions

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

maskops-1.5.1-cp313-cp313-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.13Windows x86-64

maskops-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

maskops-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

maskops-1.5.1-cp313-cp313-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

maskops-1.5.1-cp313-cp313-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

maskops-1.5.1-cp312-cp312-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.12Windows x86-64

maskops-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

maskops-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

maskops-1.5.1-cp312-cp312-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

maskops-1.5.1-cp312-cp312-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

maskops-1.5.1-cp311-cp311-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.11Windows x86-64

maskops-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

maskops-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

maskops-1.5.1-cp311-cp311-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

maskops-1.5.1-cp311-cp311-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11macOS 10.12+ x86-64

maskops-1.5.1-cp310-cp310-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.10Windows x86-64

maskops-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

maskops-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

maskops-1.5.1-cp310-cp310-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

maskops-1.5.1-cp310-cp310-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

maskops-1.5.1-cp39-cp39-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.9Windows x86-64

maskops-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

maskops-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

maskops-1.5.1-cp39-cp39-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

maskops-1.5.1-cp39-cp39-macosx_10_12_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.9macOS 10.12+ x86-64

File details

Details for the file maskops-1.5.1.tar.gz.

File metadata

  • Download URL: maskops-1.5.1.tar.gz
  • Upload date:
  • Size: 5.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1.tar.gz
Algorithm Hash digest
SHA256 1a57134b934dd552586a08128f94dcf12c7c9ec4a8409205c2492bf7ba1fd09a
MD5 13b1fd6186d043c51b1aad2bc1633401
BLAKE2b-256 18b78debf7afe485c686eadc1eb4ebcd1853d51a7827bd021583a90a2c7a03bc

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: maskops-1.5.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5a1f24b0f0199391f9740f485245b9af301a1269433ae5b05c2e23981fa4e105
MD5 7471ec69ab371655986505fd1265bf9e
BLAKE2b-256 cb676df961dfed0354cc74f473b11c2037ff4f4e41d318f969cc93398436ea3e

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1516b68f604e2daa34031303743da79e333d3e5362dca97d3a2270977c510ee9
MD5 a891cd70b4209e4cbf89987258bfd4e2
BLAKE2b-256 1c98a92965bbae15c5c910f2c1f1abc6d1fd3263a98d3500f113a3f0cf7aa581

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 39edbb4caa6bd9128941402461164c2e45cea490d0c26595eae0fad6e68286ed
MD5 601addbb4ea0248e9034a0c13466fde2
BLAKE2b-256 989bd59c551bc2cff12d4ad2faf0cf14c5e806fa5d4c22723be17d9e3d17a584

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 10b02a391910a5e3b0224c091ec5f2ee1bdf2ede4b91955899f58cb7c4e5dc84
MD5 48f171fe1c0937e499b7f82aeed759a9
BLAKE2b-256 d3357574c5aff415cadb60461c0a903be94f87b3d447f41b40daa961bde5a20b

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 76e3fc34a9a9415c68c817a9f04665f38555b1d41b2acfc68c837ff0d9e0f626
MD5 f1168f64222bc62141603bbe09f580aa
BLAKE2b-256 539ab170224fb6e61c6eb60a99a36e70102db666eefd4cd76c4e2e03bd2f81da

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: maskops-1.5.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 73db34c6c79ff78e21e98eb08bfaa837348408984e447dd2b06ef45e63c0c0b7
MD5 14631852b2d8c84e6dfc5e6e9adc8b0f
BLAKE2b-256 043e8398eae71b1230186a67c1e8da426886dd85f2b0089bacc8aff2ca47cda7

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4b7f603b1581e52a34fca3bbe9661dfaf11ca0485c6da0796d1808068e5a21db
MD5 b50f47f85663dc4c247585a711bebaf3
BLAKE2b-256 e375e1c078f812ee479f5f3cfe066794d9a24f9da0bf7cc88301c8b67505b1b9

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 00585414c8181670b0222f3d54b8a405312a1adcaca5601104ce2e2a23f54104
MD5 a87c3895d5e6dac51c0cd1dcab469cc6
BLAKE2b-256 b77f1eaf019aa5b1e89cba9e96ea6758cff261a30b713132d38f243dc75f27c1

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 62c7df8da395912e97bd5537cd64de0959e327b7cb393ccdad1d6c163b5384cd
MD5 57b5369dc993c5f011b7abc5b7d50473
BLAKE2b-256 39bdef25f20bff94d02acd16dc654e6727da80fbd09dcb8d8e21be83059ddb59

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ad0d24c72b56bde41dfe2a8cfdb1f4ecf697ad469fecea5361878c409dfd3884
MD5 880ff1b3752b5a8c7dc17a98985a26e3
BLAKE2b-256 70aefebae0f7897c84eca138020b3eda8486c7310e2b4592700d0b82336e78f7

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: maskops-1.5.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 cf6ed40b0d8359d13160315c94a758ec94ad6658466bcf20e08c2de9b11229e0
MD5 bb2e7c19fd8e418069ddc893b51ec6f6
BLAKE2b-256 14e5e9690c48a6076922e287fff05226d9c56f8375e6ca073c2395f1aa877a83

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4ba3484a4ee4a2b0e8975179587b8e69bff4bdc6c90773458a1dd470a6c165f5
MD5 30e83929d1e57786954de9ce497c4d04
BLAKE2b-256 133dfc83f66bfd2bb5613aa706d7d55b569b3d622e3b729a585841814d0f82f8

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 00c361d256d7a7d8a54f873dbdd6b7129f26454f0c36f298655819f7021bd1cf
MD5 54c05561f068ec7fbb526817c311570c
BLAKE2b-256 4ed5fe860b79c95b9fcb418d27b4ab5fade96718d8188ef375d6ba165f5eccd2

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3c4410fb7ed29c94b0c2d1ae126ecc39a5e95e9a4c12ba32d8b68b857d42cef6
MD5 f3e9b6969f0e08b06d942d65a28542f5
BLAKE2b-256 8eb51279b3cd1b4681b31ed194f7afed690cfe91d87da6aef6538a5fb57e23a3

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 e7aea0d46cfe0fc7d0e029c285d191cf0c26222f0fb6510ed28c3307d164fabe
MD5 ff002a2df70c8c155c7adb0b76e78aa2
BLAKE2b-256 d011bb3fd898e33d4de25268872074125c054f3795adec1fc303021fb2cd56f8

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: maskops-1.5.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 fa799030b1bdda88e444ecd4b2d5ede0cc2731cd43083a28d2bc4e17bc6293c6
MD5 7aa9fa9400233fe7bdeca99f6f02f342
BLAKE2b-256 e08c3f9ab4e1b945c54cd66fd874c01d01d2f889fd559adcfbd3dd3c38c7b6d1

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cded93e68ca54acaf0d959dbbeb2460f64d3f23f11db0f6343ebab93c65b7156
MD5 81af87124d6eaf11486390f44b0abf37
BLAKE2b-256 60442a69edeaa01ebe1b6e9a915059bea40b29799b05babf688034445417b4d5

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 14c2e749ad6efd544ab82f04a610c809716daa2367998ca73d2246409fe3ad3a
MD5 f94fad2e682aad2aa199babdb7911edb
BLAKE2b-256 cbea50571b9101c5eb1166516dadf058e6fdf70a8c6a3783a62fd135f5b091ce

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e55e5d210f78f945953f4141751fec2118f744a1ac713a59d31c19a3f9abbb4b
MD5 0c0d584c250eeebfd3a42e98d0e194cb
BLAKE2b-256 8e8ce5625800a0c4f27166a5ce4f13638e4b69023cc43083f8f6e5145c98031e

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 751da388fadadb99c0b0af54ae798b3ce25e973e199610bb236397e9f5a23088
MD5 4e9dedee784d9b200809f597469c404b
BLAKE2b-256 167e57f4754185cd847bc45c0ad59804762fb9ddba4568fd5a58834eb939482f

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: maskops-1.5.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for maskops-1.5.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 8c6c08dccaeccf67f7ab93d31c91c44c8701afb52c93941c27bc71ea6f85a1fd
MD5 669d718ceec3a780e0c50aefbc65f658
BLAKE2b-256 87374c2970d6861d0185f73fb6bf1563beb6e239846c694b64a0ee536e96e69c

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 245ec2df541a6c5fe95e180fcbfcb532b8604b76593053ccc07a2db09f9e4150
MD5 147cb301117b1ea1e8cd0b16c571d809
BLAKE2b-256 6e2a2c5728086a2e55b0e05601d73b8aaa20d9742aac3e6ab7ab11a0a2c51f6e

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 68bc2ee5b3747718352f3cdf2f3d8444461f1d800fed08825c1f94dcade33f1e
MD5 0e5b15f0aab8c3973bb423ed8837ad97
BLAKE2b-256 cf72a246930d7d610e009655acf9292617696f548847ff5c3ca25369c281e1d0

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e922c3de76958bcc6d62ab9a8f769e70f971c8f0679039e4337d05fb6fa050f4
MD5 554f384890417f1b801651c4d9b275c4
BLAKE2b-256 29acb6fc9f8f7943713733c97b20b6e0486522cf24c809e5733f87a3fbccd6fb

See more details on using hashes here.

File details

Details for the file maskops-1.5.1-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for maskops-1.5.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 09826a4d6fd10dfcb964060cc0f1c0b5055460deb536c354d10d5f01b4cf09a9
MD5 1dbd72094723ded9097ac64b0f8bd191
BLAKE2b-256 9791226ae489099a4bef1c8c312a87f38825dbf2ee910a74bcc1a35e280d52b4

See more details on using hashes here.

Supported by

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