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

Uploaded CPython 3.13Windows x86-64

maskops-1.6.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.6.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.6.0-cp313-cp313-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.13macOS 10.12+ x86-64

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

Uploaded CPython 3.12Windows x86-64

maskops-1.6.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.6.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.6.0-cp312-cp312-macosx_11_0_arm64.whl (4.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.12macOS 10.12+ x86-64

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

Uploaded CPython 3.11Windows x86-64

maskops-1.6.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.6.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.6.0-cp311-cp311-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.11macOS 10.12+ x86-64

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

Uploaded CPython 3.10Windows x86-64

maskops-1.6.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.6.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.6.0-cp310-cp310-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

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

Uploaded CPython 3.10macOS 10.12+ x86-64

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

Uploaded CPython 3.9Windows x86-64

maskops-1.6.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.6.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.6.0-cp39-cp39-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

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

File metadata

  • Download URL: maskops-1.6.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.6.0.tar.gz
Algorithm Hash digest
SHA256 206bd4b601a77311a3aca30d771771baeddeaa579a53d7e7795e26df56a3c7e5
MD5 2fb8b9d6d615affc9ab0f6bce5b20a49
BLAKE2b-256 99597d47a0b9f35b7068a9ed2de162ce55742ef44a66c75740418faf4fd52123

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.6.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.6.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ccb7657e2a13df5f62afd998b2e9635708dc6bce2424469fc7372f81d2f1e277
MD5 4fa0d4ff3da4a63bf08cadef86aeccba
BLAKE2b-256 c616e59bb1e1100b9b3eb60ded30baaaac2b5eedfc5f29f0f9675f3af9756849

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe6c23887fab21fd286a282f80680e7948cf7332c559dc8d5c3ceee3efdd7191
MD5 53370aa5291c6f5d2a802627302d12da
BLAKE2b-256 ee1ab278417ffefe25784171fefd3744dc42f0df33042463dbe46c198379d8d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0736754308c6a4908244b64f419bfa4dff58eb0174b7081b61496bac334ef7af
MD5 96257044f24b304f8e02c5a8341df321
BLAKE2b-256 4419f50da924160189397d48915a58f48a71a72a01e0aa7465ac09909b9330fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7b969b96e7c49db9cd839fb1177608e99e3d63a51649724612d19bf13676cdf9
MD5 812e3acc5205910e3fb7f22c8ae5cafc
BLAKE2b-256 c8b78311dfba1149c200ee4db67b83593ea5f36ea66f9700938f8e23b06a12a1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 05fe955ca576d2966ff4865ae79558ffa81756d00d43c76768f7cd95b90c3477
MD5 e6b891acbd3e6e57ee3bc4ee3ac30180
BLAKE2b-256 4e8cfe06995b19e5353e1a93dbb95916c38293999426425cf07df901206aa33a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.6.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.6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 17f53115fde171638daad135b8ce356c6d03cead888817123e0519a2303b101f
MD5 6f2241af0c4f0289eb666a86b2c8dd78
BLAKE2b-256 b6c1146e5f12d658fb26095e70c69490e58c7d5114138cb5bcb73a607d56b97f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9bd66aff72ef7110e86fdba22fefc3e4f8354b0e6743c53fd7dd03e6841892ec
MD5 6cc76a032ffe4fd26a33e71f34923dff
BLAKE2b-256 31cabae036b76c2d0f3eb6722adc05f7dd49b2c458eee0e0af8dbe9ff941df7f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 45e7702ab98aa3f5f21fb6ad7f89186be8566af009277543f340a85e97d38270
MD5 8c7df9aa634941e8d63973c0688d53ae
BLAKE2b-256 1561bada9e6912f4220fcf8fd1ab508237501a9cdd1b19d5fb53d8ea1f37cc24

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 03071ce1f6a678b17d08b6427545e8ae43d87d8a25230c317f2873e86175595f
MD5 5c73b909abe253efb156c8547a300d10
BLAKE2b-256 062262a9113247262b7b6f670f6f316a49fbb9a1b38ae844cdbc8e2ff4a49a11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 71fdfb3a23a9ec724c0d13759c7d8b41c3d99c9054f014e0f0e3e99bf9bfacc6
MD5 2b45b879a3feff64ba4e06f7522fe0c2
BLAKE2b-256 a956b1cce8bdb2763a4d496581f174df6622d5cadca04ee620ddacb9b656a0c6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.6.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.6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 55e462a00ce48ef5331796879b0c702bf957c39d6009fbb9338724130a78328f
MD5 ea3e79aad92fc162078f3db8f22dac33
BLAKE2b-256 a86f62e3f283503211ac2894d2b53a0f6ae3af56f7cf6e982a605a6a0ba3f3e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e75156228b296fb98ef36c1bb3cb922a8ea8ca180ab7bbf596f82d8531883833
MD5 9f9046725dc490787346f20fb327eaa6
BLAKE2b-256 de0b1a1c55b6c9f29afed66526e0a4e4284e5f0fa5a30e8b2027716d4adb433f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 802ad71c54b017c3de130d10e6e4209cd88cfe1805c72542b61ce24a35f60a18
MD5 453f2150cb6129b6cd575e845e6dfce8
BLAKE2b-256 4150340d5611ff4e1eaa0404358b59c91e31070ae9a4d1f720526d0f5b73b1ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c4cefed637915942573fb51bf676d97b7a6e3a2bd071d8663746f4563880473
MD5 f8a37c1368d2a94c33c642289cf0187c
BLAKE2b-256 96606b9dac035e50a4bf4d9dfc7ab333c33612202efcded2765d281c605c967a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 40d98fda1f5b4163ac4272ac1ca81ec33307e5a34484b0bf33e55cf3ed6880ff
MD5 896ad0a91690d35e355e87c0e0fdf981
BLAKE2b-256 4652cb5b8a05d07eac44c4bb1b0fcf18435a986f75ffe0b02c8294ec0cd94beb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.6.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.6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 014503bb112007fc7d445512e4392f1089322031eb7c625304734744ecf1bc3c
MD5 acba7077f12a4993bf6a40cf91daf11d
BLAKE2b-256 0a9e7c655a7e57a15139078c3aaaf8b91685c4a852fc26e73fb4cd4a2fade7d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ecb6fc97ad995d2134783e8d2e0baf2d600eab1dff5995ae5505a2524e5c83b
MD5 987aeac06243ddb794b720fc7a0e04a9
BLAKE2b-256 ed524e4123654cd3022c5bedb21c7e739fa81cd86931eda002810feb2f60b8af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5a2fa5c197e186d66003da1e339bf90c9db497c14070b2fbcc18d32833efc1ae
MD5 273a488db0d10fdee1be10c5a707064d
BLAKE2b-256 3e74e26b39b4c2f8cca41211055d5824a3b9adddf448d61d76088f7a21316450

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7de36226c9153e0d848b949e13d0db97a02a8b4bfbeb67fad2cca5637918db6f
MD5 2194f09e5d4253877e233f6e9c1bbd6f
BLAKE2b-256 030df7580af6bad089169e76fe6975e413dc9026db9ffee0f3ed034ec3318347

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8e22359178c86ce365496c852ce75abc4caad2ae2e23ce3a3c6a12a360143be5
MD5 13bef4adde9abdc3fa8027466b538618
BLAKE2b-256 47aa3fc5b1d574d663e501663d9f28d6a69adb0d322f6b44f82e29b0ae96844a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: maskops-1.6.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.6.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 af2128f42ff8eff2e4078064b012e8061b211f4991a3685c532e6a67b97aca7c
MD5 d84489143f4221b77fb75a52cffefea4
BLAKE2b-256 0c771b546aaf7c6419e908a9896536fc65a6a02d1645e604ba4da00c8012b1a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 08f7c654b276d17f87b17385c0a9e4cc6f705dc77ad73715ad1f035d9d09c7e0
MD5 f14e66d30c8b045261c60dc759206e37
BLAKE2b-256 6637b1f8b856c9eaabc6c8702c5bb2d6e80c04edca7250b808c4b9b310bc663f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 31506ffa15a5445f5651c81c61ff9c9ba9c68fdd13e82da8701e68c1160c7436
MD5 7551c505c0423b3da0dffdf80d489000
BLAKE2b-256 db9b8d100888ed1631a45df567bd26fc6c7261eeba94982b9e8771e308ecb4ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4b3ce54ecce35fd154c30429db07ce9a849f3caa03cebfea2f7ad0cbf3466ba0
MD5 8da9389f9babecfbead7ace4e4b8b114
BLAKE2b-256 4ae2a8518ece2065168afe2eaf8d6aeb1db92b78877080a7a3dd2af2a80aa7b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for maskops-1.6.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0ffbb35ce41754c63a96227f3ec19cceaae4a127143255a17f601b8d21b6e815
MD5 0bda456d3695c208caf03bc59a6464be
BLAKE2b-256 fb68d1262db741aa364d372d86bf839baa92a96913e0b63b763f82e07434e55e

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