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
  • 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)
  • 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.7.0.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.7.0-cp313-cp313-win_amd64.whl (5.0 MB view details)

Uploaded CPython 3.13Windows x86-64

maskops-1.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

maskops-1.7.0-cp313-cp313-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

maskops-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

maskops-1.7.0-cp312-cp312-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

maskops-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

maskops-1.7.0-cp311-cp311-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

maskops-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

maskops-1.7.0-cp310-cp310-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.12+ x86-64

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

Uploaded CPython 3.9Windows x86-64

maskops-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

maskops-1.7.0-cp39-cp39-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: maskops-1.7.0.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.7.0.tar.gz
Algorithm Hash digest
SHA256 cd07e7e42b1bed77627ce512a0c6d0a92244544ce9494f83572636aca971b455
MD5 6299d6226d81ccd7fa47e38e804b71a6
BLAKE2b-256 8267d8e22c6e4f5ee94ee250185f397c19dfb753013200867a7a4e735a729129

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.7.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.12

File hashes

Hashes for maskops-1.7.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d9800361bd62a2e83e376ab74efd2857f2d071a031b4f661c434c938733aceef
MD5 1da7c9bfa84ee077937dc1e2e244178f
BLAKE2b-256 ac31548b273b2ac197e94b1003406e74b2c74a2b23034e2c78481bfd7275658b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 71528c83c447edb8dddceb4d71e2438c1214451634c8452b2c7086bdb77f04f8
MD5 71afcdb5275d6255b345f5a7a436b74d
BLAKE2b-256 eeb42a3bd7b6336ebef16eaefc3cce9bae5b98eac48ade90a3aa514dbffacc85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b3ab1777a8786d5503f5bd84f1b03b1a20ecf0a35a39d841372ec812ec2ed071
MD5 25309698551223fbf80ac3b9f212b2c3
BLAKE2b-256 7a84f322c608eac3516a5cc8e732a48e3e90f4a52605285e7e01eec0eb0ce441

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 58135ee2e232db0cb16d000a2919fda1005d07839d574562872fb614ce503ba7
MD5 647f1b4cd1895d97ef8aca0c9c19a5f8
BLAKE2b-256 6a73b11575e3c2b5cec2e2e19d22086b6807cd2f988e5012d62070354ac65255

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a80fb367df31569a4b1336b55d4017501e83ee105109d79a8eb77173014993d4
MD5 5a62f0c520332601c3049a6720497125
BLAKE2b-256 a891fda1c77e54c99188f7121f07bd317fe3a4b068824aa503ba6c6fbd245ec2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.7.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.12

File hashes

Hashes for maskops-1.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4b3fd5e94b878fb4288692340adff358f4bb75e65c4020878efc491e7784ff0a
MD5 a9ae6a919f0629e60401536d6d9d3faf
BLAKE2b-256 fdfc0e1f27678a700c8eb8336689bdcdcb9241e1fe77116616376e2c9babe774

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 54292cd6e267597a2da89a62c15bad62e1bb3639cd41ebffda181a81e84854c3
MD5 87a10085ddb6973886b05554a2bc2d4e
BLAKE2b-256 08e7d2894fd1e0b92ec7e4950267104d521dc6eac74248afc68764dcf974e548

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bfa54f98d0a557373fc107fc0e72ac80889b2c036ce7e0507e13163f026325ce
MD5 7dcbc0176d72afe3d97b94a326c78b66
BLAKE2b-256 6bd230fdc7c95f5502b752dfdcf9e978d48beb62a510530b2b0a702e923e74de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ecf67a6213b3ad1afaa21d3464e27a55fc77e45097db316019cf83ceb484fd7c
MD5 55574d500285d662339370c810000e54
BLAKE2b-256 d53caeea8d5662142687dab9386596bc6c4c2ab2c87213b4755e74705c79fb68

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 770b5e67a03c98a775d10f366e6913876c878544687983f526d8a648c4057b26
MD5 8e928b0cc0ccccca6e5d8a01001c7c66
BLAKE2b-256 6c51c97a79bbfa61d05c9d7cf36052cb84791112bb816eab55d54c271368fc90

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.7.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.12

File hashes

Hashes for maskops-1.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ecbe96090310fcb907d7502b704ddcbc7f9d27e1547e991435500eea52c40090
MD5 6ceca6d4991478ccb27c7897b193e824
BLAKE2b-256 d173c56f786f4cb544f60bca0a0887f6dccd6aab367586b8e566d8e490500db7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 46f17b12f2bbc379218f3905e1638140df245b01594d05dfa95a859d70fa6956
MD5 cfdaf6913ded596594d7051ebbd02cc0
BLAKE2b-256 a3dd00fb0d722fc2bb47a208e4aac127cc0d50ff3ed7ff25299eea443b46e1ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fe028795ed30e4515e3185f8226ab445be6ff7842d78c4514b98da1d6a14144a
MD5 7935aea732c71bc9c38474d4a3a1c644
BLAKE2b-256 3a9e1e5ea4bc4bfa49d6bcfabb66839073d44bd9ca05b0f50c4b29e61bd2ebd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 664460a3586c03a37dfa9e7fbbc9ab0220fd03355c221937993442f0339a6821
MD5 09d3fb3ec3d839f0bad982beb5781e34
BLAKE2b-256 1c8fd52692670c2834f20612c6caf444081b1a79bedd6d9cc1d87d72ca5dfec7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2961fd3f085e97de8f718049b2541e99f8f4ab6924fafcc079a3c2f5fdb3e2c4
MD5 d01236dec8292ed89a785568dca19344
BLAKE2b-256 de63af1ed95053fe60509dbc7bbd13179c93aae2c2463e928d2f6f107e05e1e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.7.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.12

File hashes

Hashes for maskops-1.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 236731d985f9d07b8003be0f3f18e32e2b16c98af8a051d55c5253d5eec04d2b
MD5 b118cf499319bad96d08f2e541737dce
BLAKE2b-256 12ab60c02af7702d87cd1c611caf17bfc2a243a858fba3c4c22bc6e1429e752a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5703fd100fec2217d4841e3908ff69fc90600852c31b379fb06a5c9546344df2
MD5 54f3a3f556919426a509fc105efd06f0
BLAKE2b-256 809c1501c6f0ba5a96f8e675fd72ee716a2ed5374cbf27ace14da6a432716254

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f8a8f1933b673516bf197225c6e517167e95b813a41701d568d8d04786b3ad8d
MD5 3063271447be6b758a066faf60acb2ad
BLAKE2b-256 95b0b5a62aa75b6ac08cd687e69257423a79ac92c54c46945d97ef0e2c64c2eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f39a5eddf9101df80f5af6aec4a1e1eb62f18e51da069ad4bb7efd08c49dd64f
MD5 0a1c1e5da4abf9eaac481b5c203afdda
BLAKE2b-256 47c06d4e58ec019a95b48a9f6e488fc4034872e0e3eb6a066103f2d658dbc343

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b130e8673393d23d675494c3911ad637cfd9956cbce911ff445b689e4345a638
MD5 ae8b7e561205ab7440db66243327dbc6
BLAKE2b-256 e7c4fc1d892ced144d6cd9fc81e3e8f79906d23e5d7924b9cc406a44bd6ce099

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.7.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.12

File hashes

Hashes for maskops-1.7.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a0a7d7af6e2103d24433163dfaa967011cb647c7dc36ceac3a0522294e961253
MD5 37101bab8dbe7c2a7c8407fa741fa1f7
BLAKE2b-256 4f5297544d29214d8147873c2dbe205bdd440684be1415b20a0b7cf2c5d30c41

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b94dd6259f09741713667200bcc1b10541991d1915b12e3fd0fb9f0d911231d7
MD5 4d1edad6100ff4b61558ce40d7428944
BLAKE2b-256 f5c469ff6eff5f1ebe68467341d70fc2f68beb2b6ae7bba8e69f62a5e523cb9c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 944fb2f736c93b61c6afdbbc62160999e65608eb79373a94a679866fad3e2f5a
MD5 3da2e5cd3068a62e8379f37f0260ed93
BLAKE2b-256 11114c16911184b8fbf851363abaa6fa5bc7d4c8f5f3349964bd3e2430a33d0e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5fa31c540c90471d237e17dc1f541d2f1dabd82ad4047c8013807a2ddfa532f7
MD5 da667795c229f711570ababeee45e04c
BLAKE2b-256 765788a63e9bf478654a1e4693ddfc63de40dbff0c26e738dc2c23af05d89777

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.7.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0bafc681d7e2eff4cefbe58f92c534fc645fe48fd4b21280088633e397db5776
MD5 51c8d4332d56500dfd1a9d31868c7e1a
BLAKE2b-256 d4ad40176ff2861445266b18de656145b442664af91d4f4b4bf3892ac61a1394

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