Skip to main content

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, at the 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. Each family is compared like-for-like: maskops runs only that family's patterns (mask_pii(..., patterns=[...])), matching the exact coverage of the Python re baseline. The three data profiles are clean (no PII), dense (every row has PII), and mixed (50/50 — the realistic production case).

Why the clean profile is so fast: every supported pattern requires at least one digit or an @, so maskops short-circuits any row without those bytes before running a single regex. Real-world text is mostly PII-free, so this dominates throughput.

EU patterns (IBAN, VAT, Email, Phone)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.102s 9,791,624 3.224s 31.6×
clean contains_pii 0.028s 35,608,478
dense mask_pii 1.430s 699,175 1.832s 1.3×
dense contains_pii 0.143s 7,002,522
mixed mask_pii 1.159s 862,821 2.085s 1.8×
mixed contains_pii 0.119s 8,419,309

LatAm patterns (RUT, CPF, CURP)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.083s 11,995,024 2.364s 28.4×
clean contains_pii 0.022s 44,911,928
dense mask_pii 1.301s 768,811 2.220s 1.7×
dense contains_pii 0.351s 2,851,885
mixed mask_pii 1.147s 871,941 2.392s 2.1×
mixed contains_pii 0.329s 3,039,982

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

Network patterns (IP)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.101s 9,895,621 2.777s 27.5×
clean contains_pii 0.029s 34,285,322
dense mask_pii 0.891s 1,122,653 1.902s 2.1×
dense contains_pii 0.292s 3,424,025
mixed mask_pii 0.699s 1,430,777 2.211s 3.2×
mixed contains_pii 0.228s 4,384,771

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

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.107s 9,331,431 1.233s 11.5×
clean contains_pii 0.028s 35,165,948
dense mask_pii 1.061s 942,647 1.337s 1.3×
dense contains_pii 0.345s 2,902,612
mixed mask_pii 0.819s 1,220,878 1.371s 1.7×
mixed contains_pii 0.290s 3,447,494

Luhn validation runs per candidate match, which eliminates false positives.

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

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.100s 9,996,062 1.748s 17.5×
clean contains_pii 0.026s 37,979,203
dense mask_pii 1.541s 649,021 1.392s 0.9×
dense contains_pii 0.370s 2,703,177
mixed mask_pii 1.248s 800,992 1.472s 1.2×
mixed contains_pii 0.308s 3,249,503

The four EU-ID formats run as four separate regex passes; on 100%-dense data this is the one profile where a single combined Python regex edges ahead. Clean and mixed (realistic) still favour maskops.

US patterns (SSN, Passport)

Profile Expression Time Rows/s Python re Speedup
clean mask_pii 0.099s 10,066,631 1.680s 16.9×
clean contains_pii 0.028s 35,939,291
dense mask_pii 0.972s 1,028,341 1.570s 1.6×
dense contains_pii 0.447s 2,238,417
mixed mask_pii 0.739s 1,352,974 1.628s 2.2×
mixed contains_pii 0.343s 2,912,967

All 15 benchmarked families active

The realistic production workload — all 15 families the Python baseline implements, running together. maskops supports many more families; they are excluded here only to keep coverage equal on both sides. contains_pii reaches ~1M rows/s on dense data — use it to pre-filter before masking in hot pipelines.

Profile Expression maskops Python re Speedup
clean mask_pii 0.114s 18.681s 163.4×
clean contains_pii 0.028s
dense mask_pii 4.693s 12.659s 2.7×
dense contains_pii 0.959s
mixed mask_pii 5.239s 10.620s 2.0×
mixed contains_pii 1.037s

maskops throughput stays roughly flat as pattern count grows, while Python regex degrades with each additional pattern. That is why the all-families gap (163× clean) dwarfs any single family.

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). Reach for 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.

On structured data pipelines, maskops does the masking without carrying Presidio's NLP overhead.

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
  • mask_pii_audit expression — masks and reports per-family match counts in a single pass, returning a nested Struct (masked value + counts) for compliance auditing
  • Brazilian CNPJ (legal-entity) — two-check-digit validated detection and masking, in asterisk, FPE, and consistent modes
  • masking_manifest / write_manifest — per-column PII inventory with match counts, built-in family→regulation mapping, and mask mode, exported as a JSON RAT / data-processing register (Ley 21.719 Art. 30 evidence)
  • FF1 mode (NIST SP 800-38G) alongside FF3-1 — mask_pii_fpe(..., mode="ff1"), reversible and length-preserving
  • FPE key management — derive_key / derive_tweak (HKDF/HMAC, offline) and validate_key / validate_tweak weak-key guards
  • rekey_pii_fpe — FPE key rotation on a token column without exposing plaintext
  • MEA identifiers — South African ID (Luhn + DOB + citizenship, POPIA) and Israeli ID / Teudat Zehut (weighted checksum, PPL)
  • Unified patterns= selection across extract_pii and mask_pii_audit (v2.0 enterprise release) + migration guide
  • Performance sweep — byte pre-check short-circuit (skips all regex on PII-free rows), like-for-like benchmark methodology, and a full benchmark refresh: per-family speedups now 11–163× (clean) and 1.2–3.2× (mixed) vs the Python baseline
  • Type hints — PEP 561 py.typed marker and .pyi stubs for the full public API, so mypy and pyright type-check MaskOps out of the box

License

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

Download files

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

Source Distribution

maskops-2.1.0.tar.gz (6.4 MB view details)

Uploaded Source

Built Distributions

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

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

Uploaded CPython 3.13Windows x86-64

maskops-2.1.0-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-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

maskops-2.1.0-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-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

maskops-2.1.0-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-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

maskops-2.1.0-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-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.12+ x86-64

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

Uploaded CPython 3.9Windows x86-64

maskops-2.1.0-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-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.9macOS 11.0+ ARM64

maskops-2.1.0-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-2.1.0.tar.gz.

File metadata

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

File hashes

Hashes for maskops-2.1.0.tar.gz
Algorithm Hash digest
SHA256 7bf88fc8377c56bfe12cb911c945e743df9cace2d4f886078a0bb0785c0082b8
MD5 572509f37261892a9fcaaac9b7886bbd
BLAKE2b-256 2fd2882988aa3822be61d1f52dfb4f912360b94bfdbdc8eb0207b1909f38f5c7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.1.0-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.14

File hashes

Hashes for maskops-2.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d978f6fa4d6a8dcf7d9dd7c7bba1a86e9ebbf3a576034665b97c99b966cc1910
MD5 0d4714ca07bb8b61f6042f1d733b925e
BLAKE2b-256 2ce3ffe2f86e1a3a215e42f73282489f082afc564cee5ba0b14bda06fa6abbbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0c61eaa2b16f0a9af9e7e84b023e9e4ec3c9fb3af55d51a90eb81ca222b08cf6
MD5 ac6a322d796bf18b7e85d16e87096ac0
BLAKE2b-256 0d2e90033944d6a721ec0de2f381687003e412c3538bade1fc50abbd81e8c513

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0af0546fca9d47e012b93be37ad637a40439bf7ca782de0362a14d0ed4faa122
MD5 e11ac184dba4229f3c53c0da88ad744b
BLAKE2b-256 fb5680f50de2e0379a9737ed1e8c3663f5a64fa356bbcb253f607fd100c68ee5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 74cabc482db32658c809284d68dab5d8d929d946f67e2d67d01d34bfeb95cbb5
MD5 ca4ac6c8ab9c27360fd6416588d82c75
BLAKE2b-256 8267ece50c2eeaee67eee6f7dfb2655c99cec04bca8054f370c50e2c966e4fde

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f0cc92d29cb88fc8e893579c2fe0a95cc9bf1bde986e28997c6bd5b9f33c0c8c
MD5 7504f7c33a94eb266c88d73379437968
BLAKE2b-256 dd0c494f7db78f977f76b56d58dce77bfba1352b7af3ffa1a231a02e50fbc4eb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.1.0-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.14

File hashes

Hashes for maskops-2.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 574bad61f15695df42910c2f1cb6f983b7016983bd39554c971bd213edbcc99a
MD5 42064ac2175c01331f6e1530ba8a26e8
BLAKE2b-256 c614e80314250000bc4853637ff3b1371846d6818585a4e5262b71367dc143ff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e612666c8d3c9925142a4bc82a0ce29e5396edaf0e4be518ded063d5e26ab2b6
MD5 80353d48f1c2275a978a836a684e511c
BLAKE2b-256 da07c11fd22fe4dcbd1f42b2d58e140510b9c9c93ba2849b5f13e0d857131a7e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a5cd3eace96d53b48fa7bd1f218abfb8afb0823728fc413be9029baef668f568
MD5 303a46d62a2f0fac8d32ad862e59fdf3
BLAKE2b-256 dc3dc0bdf4a3393e0bb2c8837ee277996abf6f24db23e565c8c01ecd12157061

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e756e8af99dfadc74704431c3135872e270532c46039e74fd8522347db0e3bd1
MD5 3093847d91f642b8ecd3dac47efdcf4f
BLAKE2b-256 21fff83909c8896f591b3b308748add9431ed3d682c6ec65412beea87f5f0102

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6fd472af33bcc61e52d08735362bdb0e3c6b180b74fa0eca38a0bd3b607df10f
MD5 d5dcafa9ee899c87f610e4103202c768
BLAKE2b-256 31eb5189671f4661c0152036f4b4b5d54654846e2bea90ccac8fe4e70431b94a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.1.0-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.14

File hashes

Hashes for maskops-2.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e81d3f9c7b57c34c05f66e7c1d3a1347ef787f3ce6e43d5a0983b40f7ecb1535
MD5 1fd9c6d1cc3f49eb3038d790489dcfe0
BLAKE2b-256 1bad78dfec2045677bcd87c41ce54227e0777c2c24701f1f9b4532561721e294

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 704b531f8a6ed6b421d917523d3c965234987b681847da70cdae6ca7bda580ba
MD5 495eadae66e7f6f440207b51954523c9
BLAKE2b-256 c54763dc617563c42c54af1c93c2d571fc61a05bad8eecbefaa4a442ef9bd3f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 deefead680c4293141c3147c9d567a69c515c94da66678c53457722202698014
MD5 b56818936e69fa55805057c079147fed
BLAKE2b-256 9a9cbb29eec65ec78d9aafe24a8031b2a47385028aa0d64cacdaf96e0bcf3016

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0eefc7ed892b11d365c88b0edcc902b96f8cea0b52a6628038161a6851c9e7c2
MD5 ef9b9049a8b1eb00b37f2868d1170cda
BLAKE2b-256 02869cd1cfd278f1acab0ed5b4a4b9fe3d98f7b4c0382aed30d9cc0aa7303f5c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c8fa5159de94c7fe531e280c91b61a9146be599f4e113d1256041f3f35fb6be9
MD5 dead27b5c963081489eebcd854628c9a
BLAKE2b-256 70cb1625c27fed63212487179f8a701175c00426c53ccb43da3d9849fa8a7ac2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.1.0-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.14

File hashes

Hashes for maskops-2.1.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 ab1acdb69e869ef6c1219dab1244e6af1804d419dfadd11c0d12a08488daceac
MD5 c513bbe4192de0b08630779a2ff1ee83
BLAKE2b-256 e47e26ab01de6790737d651dce0b8ebad25b2a8eca8fcdf43c127bc77719f75b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fc86400f1df8111a1888b8c8a8fdc2dd57d671ca19724f9b25eaa6dd1793a644
MD5 0cbac21d8e64b8e983f6a8e455174902
BLAKE2b-256 3372a9bdaae3e750524b3999bc12768aaf561c8019bc80ff372ba2ac81998c3b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f692b79271539021afb2e8b95889eddae11eefe6351b18b83c9edc2e26b0e0dd
MD5 444cb04f7a28a3a9c114551fc69b3898
BLAKE2b-256 60e2a10e38d63fb75767892433377af5d36482e8af5edbd00f5e3c7cd5f42124

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4d8ffe0a9c84d6cc8bb084750a1f21d4e25e11bde777b407d328363b1679e13c
MD5 ade47e4ec2aca6e141416e8488039f5e
BLAKE2b-256 1f815755bf4f947771d4c496e3e4b9b6e4e33c55db2d06c5e347d4264fe00446

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0c769cf2c9894dc1541442a4a70d9b6f16852336ef8ffd9c6ef5c2c2b8d07957
MD5 673b1721c22d05cbf48c2f1357b50c9d
BLAKE2b-256 8c6c08069b524fcd752aa2881d68653943f5256f4c4637a0a89eba0a1a20f66a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.1.0-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.14

File hashes

Hashes for maskops-2.1.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 dfb89c5cbaf876fedb93c75b88b4c722ce8d7bcaa6bdde30f3688aa8bd376917
MD5 e63e43b1e52199f7333e603662e91055
BLAKE2b-256 b2b9f57c5be0eab769f13313496fb17c03fe39a16726929f2a7ca8424a9813fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c609913e17f535d627b5ae5fab0ebaa85f98b4217f863930a90a0838f2a74a89
MD5 a023f2399d820a71d0bc0fe323894b37
BLAKE2b-256 162475fd43e8f75f3240eaa7851196956c3e0864f4ae40c3bbadb63af61296d8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 17629f6294624511ca0025eeeb2f75d9d01e1f599074acc71ab7d8e695651695
MD5 d4c55aa3734266f64aa6486754fd39a2
BLAKE2b-256 4d145030900451b3c200a07c5e0efdbc73b170bec60d238d07c0272921276850

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 03e96281f2dce8dff440347138cdffa5d5f94ba7fd9c1f08e75cac2da3fc2eb7
MD5 880ff8bedaa725f37e1fd2299bbe9113
BLAKE2b-256 112e724c292cc4d433403d246300537ca9f21873121c1878c3128832e7b7efb2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.1.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2bed6f0825e0c321ad82319bae1ff74443c466485d0fef733cbf63628b321462
MD5 6d2756c961fc0747f52f2196078a8d44
BLAKE2b-256 c247e090fd20c60f722342addece96a03c4d6f8c6bd83dc5faad2ec14948c305

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 Sentry Error logging StatusPage Status page