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)
  • 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 — 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-2.0.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-2.0.0-cp313-cp313-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.13Windows x86-64

maskops-2.0.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-2.0.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.0.0-cp313-cp313-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

maskops-2.0.0-cp313-cp313-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

maskops-2.0.0-cp312-cp312-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.12Windows x86-64

maskops-2.0.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-2.0.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.0.0-cp312-cp312-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

maskops-2.0.0-cp312-cp312-macosx_10_12_x86_64.whl (4.5 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

maskops-2.0.0-cp311-cp311-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.11Windows x86-64

maskops-2.0.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-2.0.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.0.0-cp311-cp311-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

maskops-2.0.0-cp310-cp310-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.10Windows x86-64

maskops-2.0.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-2.0.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.0.0-cp310-cp310-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.12+ x86-64

maskops-2.0.0-cp39-cp39-win_amd64.whl (5.1 MB view details)

Uploaded CPython 3.9Windows x86-64

maskops-2.0.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-2.0.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.0.0-cp39-cp39-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: maskops-2.0.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-2.0.0.tar.gz
Algorithm Hash digest
SHA256 862f5e75d8097486bfc2f7e810a7aff0328da6d006391cc390cbc8d4a1c192ad
MD5 4342b7f591d0e46062ac74cfc1285eb6
BLAKE2b-256 98e6341fb39472fbc6e2b1edbe8895bf08870ffd57572a81e64f80bd061c9e53

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 5.1 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-2.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ccec2e7a9336365a9e61fd7eb5226ee04e09ebee597b515c1f92421b59ae4663
MD5 2c09712c5a7daaedfa66a64f72c7440f
BLAKE2b-256 2fe295320145435478d7ae94c53a63ee2d5b8ba65cc2eb2541daff0d0cfe8042

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7ecc95081c62773a56e54532efd40ea01729ae29d45b9b56d18ac0cc7bd63d3b
MD5 bdd2a7cad9af7abcad2e081e526639d1
BLAKE2b-256 9713f31f0e90a26c9102bf1d66e4a6f32df3e1c630e88c1bf0853781a622ba84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0c22a3db4b734d872b3205f2406aa614645b071137084b338081ed9fe94edd50
MD5 105030a2a83e8cd084f436fcd00cd34d
BLAKE2b-256 bff18b7c3438b1e2cfcce05f4e74d7004c50603247612c96a583b70b32eeddce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8f55c0184d02c1450ba41b357398c9a7657b60e89d55413a53bee8ebb8828c7b
MD5 75b12881d41bf1cadd44897ad36bbd90
BLAKE2b-256 378e779fabf8bff9c3d5fa325cb3a773df71c85930fa1295b816f764501aeff3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 209d47c9179cc5d0d72f8903035f32d69f82b33e3076fbd66f561ca0dd5a083a
MD5 ba03d9ca99418332777500d9810c5cf9
BLAKE2b-256 6233d2840c9ab4abdbac6e35f41c728f5c98769d1e71ddb8a3b50b188b4f2c95

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 5.1 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-2.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 311d650cbac1b5bb7b86ae1f17cbe0a2dc3f0d6aa3ebbe688744d7cf8b228e62
MD5 daa99195031d01eb9bf2a7f4519f35fb
BLAKE2b-256 8c4f9eb1353446cebb438f0a6feda2294f1c8acd6473c86d103fdb21360f0680

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d1786b8a0f43f96d00b60444a5a52e1a0d066a21d38b6656b632257fe5fc79d
MD5 66460f8f055e565d93d799f4dc7392b3
BLAKE2b-256 a31b6c2349893cefe85ba3aa8d5fc33d14c63d4109fa282c3d2cd49f7e6f9dae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1c429422f886282531cd9325dd8e90c3fcb2b1597cf9a8a2d99685028606bdd9
MD5 e2da16a739f6badbce07116378c4bb0e
BLAKE2b-256 363b3a58d617f334b31137d73ec811a990c80d2c4f7fa880177792a5ec9950e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b0c5288a16a6a6bb1b66817b372a1b510888de706b4647bd8d48a7f1d39b4b95
MD5 c6de412126447ec5f87e517c12bbe1ac
BLAKE2b-256 874ac5c22a4b90775c60fc096bf6be478e1ccaadb6c0c120a836924c46d92893

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8f23c63cd4637d4c529b0d6aa868a6f1503a622b7d58e4f0bc9e88f3037d415a
MD5 4c23526874741bff936f08a30a97619f
BLAKE2b-256 c10024a1959ca2da756ef6a04ca8cd9b651737050f1ebdeb34606a997b0fe81e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 5.1 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-2.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 a66d38c9cdcf70ad0edadddbadca2ab3395a5b3a505875aca2f9a2c6c170796e
MD5 647195be331568e996d0aa498ae2ebd1
BLAKE2b-256 8fe7f96daf079343204edb521dc0edee62f07287096aac51fafd7a7a259db4a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 16adc5e7e6cf99b69405d5ef593073a2735a56a3492001233bf662fcabb9d157
MD5 f0e139ad42d96b25a669c7ec19123003
BLAKE2b-256 afd561187cd972281a8451f5745e53d2ef31cb6f5354e8d334c85b306d3d2ff4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b96dba18a4596c379907bc3c40dd34c95c39b02bb207363183346772148257be
MD5 0239d5860927202168254c84d7cec137
BLAKE2b-256 c87473a3ce920567a52f9711723cb4bbc4ff6f88f4efb04153c2ac941e96348d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 106a90f718cb462afc0eb66e996b384d74a391ade4d44b30d80c9f0f52ffef7b
MD5 ca2cff755b74024a46a8de05c8d869bf
BLAKE2b-256 c9d71b8c162d6ebec4373c09bae0a930bf967c14c21e6932b97cfc175278aa64

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 674166793e25b18dd733be7c432a07cd9ada05589c3682e4152f4377cd58b924
MD5 6e19c39db437fbf32c416bd6c481568b
BLAKE2b-256 a0705083368797738947048c2ee8c0e7e0a71842b7707d20da75fb52e69c3fc9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.0.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 5.1 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-2.0.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 93dc6cc7bfe1abb1c7ffbe1b320dcfb7d2401c2611ad539132dd1f5b5d153953
MD5 06612d2f35adcde73a5ebaf484cb07e6
BLAKE2b-256 d1b185642cbc455003281aeb6a0c41f31a218cb23ff0d09c9b9eac64a5ecf2b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b06ceb6be9fffd52709a97664c82c3acef01c1e8033cd20a9c979f3ac952a212
MD5 31fdd423b88c448c355629fbfb224df3
BLAKE2b-256 bbba9a1c115bedcc3e9bd189fed018b78d1a161b7ba4b631e2623da238762fa1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bcd7ca74942f37467a2216e159e41bb8b959e5177050f302914848781ea07a12
MD5 b03f3279e607ccb4bc0c3fc15d033f74
BLAKE2b-256 4441c1c6397dc4a812a9afd5c10231716b5f201386e130a9807debf3ff0873f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7e23bcaca385a41b0c880a4051e26ad3ddaddc8542841ef6407319518690829e
MD5 50864b52730fba16ee90746d7eb4e76f
BLAKE2b-256 80bdc82528048ae1b292a2c7429dbe313d8b7f7258bb4b3f00112c6b27ad77ce

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 75d967c6219aaa2aa5187bedb9e2841fdf785939702c32da4644ff4643a7555f
MD5 1979a9b37417bf1e913fad6ce86630d5
BLAKE2b-256 ac18c3a06812166e975ea98ba6a309076b982d5827954880cdc61c48fae9b143

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-2.0.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 5.1 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-2.0.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b4c54a840f2446f28707ae93717c7ad851ed3e15ea6fcaa2e60a2f6240ab2138
MD5 f9eb2bd36c2958ae02ded2d8775e2d0f
BLAKE2b-256 70c35e15f77e6d5425b200a866674fb3c09d5e5ed91c665e21b158e9cfb574d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 21b7d91f068202facfb7df6d26de594f55e02b359330539854e332721625f121
MD5 fa5a7e0993615eb1a86f927a47f720fc
BLAKE2b-256 d0b3e4ec47e3b8d7f0cc716cfc27770a5c4548a8f5b29267369f462ee94929f2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b58d5f1de7cc66858c951d6aaadc233d5e4501494f689ce3788f6e44526b5970
MD5 bf60162315311256c5ce0ef22d8332c8
BLAKE2b-256 d486a80804258cb2a03d9b54c9a86efb0f992063a8acbf28897b6a2526160b60

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d161f59441db3baec62472929cf4fa3eb0cb6281a237c3cde65d280b4787c104
MD5 9cbc33ea1aacab20400ad08a3582b0aa
BLAKE2b-256 2b7d9ce289ce2c346d8c168a673bf6ddaa33c872781feae98d862b43ab4bd04e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-2.0.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0a0ef1da41192240eeafba7a07537720e75d96e6c54ca8a3d9f0c5c58c631b91
MD5 8d8ddc861b3feeb3bdc3c65cca221e70
BLAKE2b-256 a1a80ba08ebdaaa9641fcf21aead79ad1e393f9464d18a485f29ca37ac08f6c9

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