High-speed PII masking as a Polars plugin — powered by Rust
Project description
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
- Install
- Usage
- Supported patterns
- How It Works
- Architecture
- When to use MaskOps
- Benchmarks
- Build from source
- Key dependency versions
- Roadmap
- License
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, ormask_pii_fpesignatures 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********* |
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
.sothat 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_piireaches 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 | ✓ | ✗ |
| ✓ | ✓ | |
| 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_piiexpression — returns a 31-field Struct column with the first match per PII family, enabling routing, reporting, and selective masking without re-scanning -
mask_pii_auditexpression — masks and reports per-family match counts in a single pass, returning a nested Struct (maskedvalue +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) andvalidate_key/validate_tweakweak-key guards -
rekey_pii_fpe— FPE key rotation on a token column without exposing plaintext - 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file maskops-1.8.0.tar.gz.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b04c71fc612e0bbd3d7583f54cd4dc10ecaf3b5daf863f377bc52b04ba6e3463
|
|
| MD5 |
7ea608508023137a4c0b98710ee3b823
|
|
| BLAKE2b-256 |
fd810379f61611300af0b359d95b9f0d1a8b90d965f0e7d7301db85c4a5ceb73
|
File details
Details for the file maskops-1.8.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
374b1b29503179547988de75779225991677ec7a03add3a49f072c685562606b
|
|
| MD5 |
418ada949d780215d9221c534ca77c6c
|
|
| BLAKE2b-256 |
ea1734e659f3f6ec57d57651b359c9e6055963c48d6e8838628c8486fd19bdc0
|
File details
Details for the file maskops-1.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37835395f501d49c2366770ccd5e169b00e9b2c28bcc6d356036af4219783350
|
|
| MD5 |
3830ec3f5823d810b0d65558f60fb9b3
|
|
| BLAKE2b-256 |
e76c4d4cc259fa49072d4b30e3dbe50d743f6f1b585dba94db1afa9545a2afbb
|
File details
Details for the file maskops-1.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: maskops-1.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfae1a5c5f688922a6dbe3ba18eb7ea72066ecf07e1dab08315d57d9fbfeee8d
|
|
| MD5 |
6483845a7e09554122a7e055a9b3e1b9
|
|
| BLAKE2b-256 |
701dc391b50d55c23a8fe8e00122119a98c49a8bb20ba53335ffafc07bd4918a
|
File details
Details for the file maskops-1.8.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: maskops-1.8.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3435cb5866937009ad04be39b10724c4aa4e9d8aee0bb451c07c18b6dede8db3
|
|
| MD5 |
f4b227ccb155474052e939166a45ff95
|
|
| BLAKE2b-256 |
f80194ccc02c1c8e18e88564d7a22239b6ea5f41cfaf1379f955932224b0830d
|
File details
Details for the file maskops-1.8.0-cp313-cp313-macosx_10_12_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp313-cp313-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.5 MB
- Tags: CPython 3.13, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c6fc13b5ac6e70deff684296345e49a8fa6b2a0f0d365a34e24c9bfc94c98543
|
|
| MD5 |
6acc48a5fcb6e88765e911c9e29b48bd
|
|
| BLAKE2b-256 |
d120e8347421ec181747124fe8d5016757b7f7a2cc62e4bbecef3fe5c656405d
|
File details
Details for the file maskops-1.8.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d3a13020032d003e212c2f1bc046cbc4e05f4e92d1a5faedc08c3920a84bc69
|
|
| MD5 |
6a2a9b8a0271e8ca30f70d3eaac4d11c
|
|
| BLAKE2b-256 |
192db1c0b1c97489d7cc29d7c77b7aa7a257f92f7494da28e006915503007c76
|
File details
Details for the file maskops-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5113a31fd04f359e2bd09e9a111e5e1a2d767a531e0c52c5c7f89dca8a0b7ca7
|
|
| MD5 |
7332b4e86bce9e8d443450fb7fa61689
|
|
| BLAKE2b-256 |
5b88944884df15842409550f6f373ec1ee412a456808fa9d9f6699cd685014d8
|
File details
Details for the file maskops-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: maskops-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4af0f26a9070b8d82b97b0d5f302192aa6b72f33f64c5b8937c393c43df381ae
|
|
| MD5 |
29ed59572773c68fd0a6888f33e79b84
|
|
| BLAKE2b-256 |
370ab9ca0536da2f83d3b9fcce7df71a55bda4f50f596486be978bd41d182415
|
File details
Details for the file maskops-1.8.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: maskops-1.8.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
692a0542611a4ebefc8cb1ee70ecad3e4d19d7dbfa6ea871afb5b8d2965ea34d
|
|
| MD5 |
41c74c914772d01f5fde35159ac57af5
|
|
| BLAKE2b-256 |
d9f667dc3a632453b601b37720373c8a4f55fc99e901e7bab17490a22ec580f0
|
File details
Details for the file maskops-1.8.0-cp312-cp312-macosx_10_12_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp312-cp312-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.5 MB
- Tags: CPython 3.12, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59403d7916f8749ea227b1103bfab804f02f6dfc260f4bd0ba7adfc78732f46e
|
|
| MD5 |
7a462bda008011f2e75528cabd45380e
|
|
| BLAKE2b-256 |
b79475b9bbb456cd5bad68157ef3da7662bc4088a7a6ad2c3e14de92b14bcbab
|
File details
Details for the file maskops-1.8.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a4b447238c3d29f4d001ccc298b01ca6a1187554e9a4a01d039593ea0fec4a5
|
|
| MD5 |
aab6a744a67b3eaf10f709be046bd45d
|
|
| BLAKE2b-256 |
07e48851090137f07cd73cb6ec2b68e9d0e2c70432d22cd3f5a4518266f5b75b
|
File details
Details for the file maskops-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
519acfd583448b85e56e7b976c37cf2585b378ee40542dc1e0f82efe7880eb73
|
|
| MD5 |
45488613ace6d3e369c35d57ee0e8e83
|
|
| BLAKE2b-256 |
e25c8a875b7d91bafc114b7f98b1db62a64c4663920c032ae9d7233d1de5bd06
|
File details
Details for the file maskops-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: maskops-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cff453703fe037297c3ad8de400001faa19ead22e3f79691f60bfbeb378e6dbe
|
|
| MD5 |
b5dd44d797abfea82450b79fab184a20
|
|
| BLAKE2b-256 |
ea75f044728794e1902fc60041224cf2a6d4ea60928ffd14fc265049f4681064
|
File details
Details for the file maskops-1.8.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: maskops-1.8.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d25a3677654efb695582ddf64edefb67eaf9d6e877fa58093d6a0621109294b
|
|
| MD5 |
b9aaf5469513cc7dcdb734e92eb41ac7
|
|
| BLAKE2b-256 |
d0fb905dbf943bba0eb993263a346275d90d5ef87de68310ff4fb4e923ad93bc
|
File details
Details for the file maskops-1.8.0-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.4 MB
- Tags: CPython 3.11, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e3b28e43077d0644c13a605f8e002e4431588a265931d0671d1234435620f95
|
|
| MD5 |
41b7ed8bf1a8873718b22f4a217fd5bc
|
|
| BLAKE2b-256 |
85f49db01c27755dd201fe902b727232094c09eddda9e7729ba313081f8cfaa8
|
File details
Details for the file maskops-1.8.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
006e424c6ac15feea6491eb0b30f75ed8bdc39343b2a858684bd3a222d12aca8
|
|
| MD5 |
715dfecef65b0400a17b7b4b061d94a9
|
|
| BLAKE2b-256 |
c423cf8f4ec56836bed73396426d7fb192428b4dbbd2adfe437bf147726e5f4c
|
File details
Details for the file maskops-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cb0ece45d4eab324e760cfe61e8b100edcdf7ab121a21afd9d640e7796e6471
|
|
| MD5 |
a49e23dfa977669d2bdfcef0e2befdfb
|
|
| BLAKE2b-256 |
e5025074c344c59da7175ee39ac47b85cf7a5365fe1354db2fe7172f328792ef
|
File details
Details for the file maskops-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: maskops-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35f2e4c70e64da4858b3f6ce4fb53956640823b2baf460e4976f52ea8efaa545
|
|
| MD5 |
adc9e18e1e4d11bcacbed28cf81428ea
|
|
| BLAKE2b-256 |
6d6be228c82e53a328cbaf9f8a0a90a4deb0a004fa03f34c1b499e0a6ac02fba
|
File details
Details for the file maskops-1.8.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: maskops-1.8.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0cc21c29d8f1692cb5f3ad32fead45f0e6815f37be321d18ddf786c382a1e854
|
|
| MD5 |
83832ec29bad6b6b1f9951a2496a8ca2
|
|
| BLAKE2b-256 |
bf859ad35e73f5488981215fbe8d06878e00fc77171b86daf1fdce74d3de8fc0
|
File details
Details for the file maskops-1.8.0-cp310-cp310-macosx_10_12_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp310-cp310-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.4 MB
- Tags: CPython 3.10, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f142fb01a70a0bb3445288c8a241d301333106819f8e1ffda7603fa58895e7c
|
|
| MD5 |
4f28a9b13fc65d453b3a0b6003f37e37
|
|
| BLAKE2b-256 |
73d770db981ee7611f935e36d0894915c882a42b8c71ba11b4662a946ba66547
|
File details
Details for the file maskops-1.8.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: maskops-1.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa116d7c557e3174a423f2709510c9747d9364120fca28300b7d66ed784db7d6
|
|
| MD5 |
df3c6c066177f7e9d8a7bb64015365bd
|
|
| BLAKE2b-256 |
11dd962bc77fb7587f9824e61ba15d6fae4877929fa1e730222d0f9add8e544d
|
File details
Details for the file maskops-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c972c439e0e106234ad2712286e6d10deaac24ca4b70bc9ad07b10220c78060a
|
|
| MD5 |
2611016c4d582a89853952d6231e4ee3
|
|
| BLAKE2b-256 |
3c4c4b8bab8aea05bee2b4ae814a1a4c85c6b97364c40828350bc5fd1c9aab2d
|
File details
Details for the file maskops-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: maskops-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d849ef44bd93d5648d93777958591ef724ca731249b7adcf768518e57861e4c
|
|
| MD5 |
c8c12cc2dffdb3d014d749ef5786ce08
|
|
| BLAKE2b-256 |
dee4b69527013e5f4257f7ed576b7f368fe352a9ee772b75dbe8d3bc18025846
|
File details
Details for the file maskops-1.8.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: maskops-1.8.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.1 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94baec6e32462022af26d1228ac1225756216985303d054d10cbc13c4f4a0811
|
|
| MD5 |
a14ca38784424b223cc46a111db08dca
|
|
| BLAKE2b-256 |
5fac88288987ae01c032a60366d65e6a815bf1a63ee9c98e4b9cfc94ad0c3dbc
|
File details
Details for the file maskops-1.8.0-cp39-cp39-macosx_10_12_x86_64.whl.
File metadata
- Download URL: maskops-1.8.0-cp39-cp39-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.4 MB
- Tags: CPython 3.9, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff3657cf662614beb34716850f20d4dc973c501c752aaed76f6d39b17583479a
|
|
| MD5 |
eb19bf75a56659304396b0a123a2ef5f
|
|
| BLAKE2b-256 |
2b516e1cfaa015424af7494a17ff22bce4d20fa768eccd4634826037f776ad22
|