Fast face retrieval via PCA+ITQ binary quantization — up to 96x less memory than HNSW at equal recall
Project description
⚡ FaceFlash
FaceFlash searches 1M faces in 61 MB of RAM. HNSW needs 2.9 GB, USearch needs 2.5 GB, FAISS needs 1.9 GB — for the same 100% recall.
FaceFlash is a Rust face search engine with Python bindings, built on PCA+ITQ binary quantization — a learned hash that preserves identity information with zero recall loss and no separate training phase.
- 100% Recall@1, 48–96× less memory. On the MS1MV2 benchmark (44,291 identities), FaceFlash held 100% Recall@1 at every scale from 100K to 1M while using 48× less index memory than HNSWLIB at the default 512-bit config (~42× vs USearch, ~32× vs FAISS-Flat) — and 96× less at the 256-bit compact config (100% recall, ~2× single-query latency).
- Faster than HNSW at 100K. On the same benchmark, FaceFlash single-query latency was 0.30ms vs HNSWLIB's 0.60ms (2× faster). Batched throughput: 27,661 qps vs 5,813 qps (4.8× faster). Both at 100% recall.
- AVX-512 VPOPCNTDQ + NEON. Hand-written SIMD kernels process one 512-bit face code per instruction (~3× faster than scalar). Multi-core batched search measured at 10–17× throughput vs single-query serial on the same hardware.
- Zero-config indexing. Add faces, they're indexed — PCA fits automatically after 1,024 samples, no hyperparameter tuning, no rebuilds as the gallery grows.
- Pure local. No managed service, no data leaving your machine. Pair with any ArcFace model for a fully air-gapped face search stack.
from faceflash import FaceFlash
ff = FaceFlash()
ff.register_folder("employees/") # bulk enroll
ff.save("my_index/")
result = ff.search("visitor.jpg")
# {"matches": [{"name": "Alice", "confidence": 0.92}], "search_time_ms": 0.4}
The Problem
Most face search libraries force a trade-off:
- HNSW is fast and accurate — but consumes 2.9 GB of RAM at 1M faces
- ScaNN / USearch are blazing fast — but drop to 94–99% recall
- FAISS-Flat is exact — but is 10× slower at scale
FaceFlash breaks this trade-off. It compresses each face into a 64-byte binary fingerprint using PCA + ITQ quantization, scans them with a single AVX-512 VPOPCNTDQ instruction, then re-ranks only the top candidates with exact cosine similarity. The result: exact accuracy at a fraction of the memory.
At a Glance
| FaceFlash | HNSWLIB | USearch | ScaNN | FAISS-Flat | |
|---|---|---|---|---|---|
| Recall@1 | 100% | 100% | 99.5% | 98.3% | 100% |
| Memory @ 100K | 3.05 MB | 293 MB | 254 MB | 12 MB | 195 MB |
| Memory @ 500K | 15.3 MB | 1,465 MB | 1,270 MB | 61 MB | 977 MB |
| Memory @ 1M | 30.5 MB | 2,930 MB | 2,539 MB | 122 MB | 1,953 MB |
| Latency @ 100K | 0.30ms | 0.60ms | 0.17ms | 0.10ms | 4.90ms |
| Batched QPS @ 100K | 27,661 | 5,813 | 137,264 | — | — |
| Index build | Auto (PCA fit) | Build graph | Build graph | Partition | None |
Tested on MS1MV2 (44,291 identities, 645,019 embeddings). Hardware: AMD EPYC 9355, 128 threads, AVX-512 active.
Memory = binary index only. Float vectors for cosine reranking are mmap'd from disk after
save()/load()— only ~100 candidate rows are paged per query. See Limitations.
Index Memory at 500K Faces (256-bit compact config): FaceFlash (15 MB) vs HNSW (1,465 MB) — 96× less RAM at 100% recall
Install
pip install "faceflash[cpu] @ git+https://github.com/raghavenderreddygrudhanti/faceflash.git"
# With benchmark dependencies
pip install "faceflash[cpu,benchmark] @ git+https://github.com/raghavenderreddygrudhanti/faceflash.git"
Requires a Rust toolchain — it compiles the AVX-512/NEON backend automatically and falls back to NumPy if unavailable.
Quick Start
from faceflash import FaceFlash
ff = FaceFlash() # downloads ArcFace model (~166 MB) on first run
# Register individual faces
ff.register("Alice", "alice.jpg")
ff.register("Bob", "bob.jpg")
# Identify a face
result = ff.search("query.jpg")
# {"matches": [{"name": "Alice", "confidence": 0.92}], "search_time_ms": 0.4}
# Verify two faces are the same person
ff.verify("photo1.jpg", "photo2.jpg")
# {"match": True, "confidence": 0.87}
# Bulk enroll from folder (expects folder/person_name/photo.jpg)
ff.register_folder("employees/")
ff.save("my_index/")
ff.load("my_index/")
# Manage the index
len(ff) # how many faces are registered
"Alice" in ff # is this person registered?
ff.names() # list registered people
ff.remove("Alice") # unregister a person (returns count removed)
For best accuracy, use pre-aligned 112x112 face crops. 5-point alignment (SCRFD/RetinaFace) adds +1.28 accuracy points over a basic center-crop.
Gallery Management
from faceflash import FaceFlash
ff = FaceFlash()
ff.register("Alice", "alice.jpg")
ff.register("Bob", "bob.jpg")
ff.register("Alice", "alice2.jpg") # multiple photos per person
# Check gallery state
len(ff) # 3 (total face entries)
ff.names() # ["Alice", "Bob"]
"Alice" in ff # True
"Charlie" in ff # False
# Remove a person (GDPR / right-to-be-forgotten)
ff.remove("Bob") # removes all entries for Bob
len(ff) # 2
ff.names() # ["Alice"]
# Monitor index stats
ff.stats()
# {'count': 2, 'pca_fitted': True, 'rust_backend': True,
# 'binary_memory_mb': 0.0, 'resident_memory_mb': 0.0, ...}
Batch Identification
Process many query faces at once (4.8x faster than one-by-one):
import numpy as np
from faceflash import FaceFlash
ff = FaceFlash()
ff.register_folder("gallery/")
ff.save("my_index/")
# Low-level batch search (for bulk dedup, watchlists, video frames)
embeddings = np.load("query_embeddings.npy") # (N, 512) float32
results = ff.index.search_batch(embeddings, k=1)
# results[i] = [(name, similarity, index), ...]
# Example: find all matches above threshold
for i, matches in enumerate(results):
if matches and matches[0][1] > 0.5:
print(f"Query {i}: {matches[0][0]} (confidence {matches[0][1]:.2f})")
Is FaceFlash Right for You?
| Scenario | Why FaceFlash wins |
|---|---|
| Edge / mobile / IoT | 3–30 MB vs 293–2,930 MB for HNSW — fits in device RAM |
| Multi-tenant servers | 100 galleries x 30 MB = 3 GB. HNSW: 100 x 1.5 GB = 150 GB |
| Batch dedup / watchlists | 4.8x faster than HNSW batched at 100K; 1.9x at 500K |
| 100% recall is non-negotiable | FaceFlash hits 100% at every scale; USearch drops to 94-99% |
| Budget / offline / air-gapped | Runs on Raspberry Pi, cheap VPS, phones — no GPU, no network |
| 10K-500K face databases | The sweet spot: faster AND less memory than HNSW |
When HNSW is the better choice:
- You need <0.3ms single-query latency at >500K faces and have gigabytes of RAM to spare
- Your database exceeds 2M faces (HNSW's O(log N) pulls clearly ahead)
- You need 100K+ batched QPS regardless of memory (USearch wins there)
How It Works
Each face is compressed into a 64-byte binary fingerprint:
- ArcFace extracts a 512-dimensional float embedding
- PCA aligns the quantization with the axes where identity varies most
- ITQ rotates bits to maximize information per bit (balanced marginals)
- AVX-512 VPOPCNTDQ scans all binary codes in a single instruction per face
- Cosine rerank runs exact similarity on only the top ~100 candidates
This is why 512 bits is the fastest setting — the entire code fits in one AVX-512 register.
Benchmark Methodology
FaceFlash's recall, latency, throughput, and memory are measured. Competitor recall and latency are also measured; competitor memory is estimated from the standard vectors + index-structure overhead formula (e.g. HNSW ≈ 1.5× raw vectors).
| Details | |
|---|---|
| Dataset | MS1MV2 — 645,019 ArcFace embeddings, 44,291 distinct identities |
| Embedding | ArcFace ONNX (w600k_r50), 512 dimensions, L2-normalized |
| Hardware | AMD EPYC 9355 (32 cores / 128 threads), AVX-512 VPOPCNTDQ enabled |
| Competitors | HNSWLIB 0.8+, FAISS 1.7+, USearch 2.x, ScaNN (latest) |
| Ground truth | Exact brute-force cosine argmax (FAISS-Flat) |
| Timing | time.perf_counter() per query, 10 warmup excluded |
| Recall metric | Recall@1 — fraction of queries where the true nearest neighbor is rank-1 |
| Memory metric | FaceFlash: measured binary index size in RAM (floats mmap'd after save/load). Competitors: estimated (vectors + index-structure overhead) |
| Batched timing | Wall-clock for the full query batch / number of queries |
| Reproducibility | bash scripts/runpod_ms1m.sh reproduces all results end-to-end |
All single-query rows are single-threaded. Batched rows use all available cores. Every benchmark script validates correctness before reporting speed.
Performance
Scale Summary (100K-1M)
Batched Throughput (QPS): FaceFlash 100K→1M — 4.8× faster than HNSW at 100K
Single-Query Latency: FaceFlash 0.30ms vs HNSW 0.60ms at 100K — both at 100% recall
Recall vs Memory Pareto: FaceFlash sits at the frontier — 100% recall, 30 MB
| Scale | Recall | Single-query | Batched QPS | Memory | vs HNSW memory |
|---|---|---|---|---|---|
| 100K | 100% | 0.30ms (2× faster than HNSW) | 27,661 | 6.1 MB | 48× less |
| 200K | 100% | 0.57ms (tied with HNSW) | 19,930 | 12.2 MB | 48× less |
| 300K | 100% | 0.84ms | 15,147 | 18.3 MB | 48× less |
| 500K | 100% | 1.45ms | 10,337 | 30.5 MB | 48× less |
| 1M | 100% | 2.95ms | 5,403 | 61 MB | 48× less |
Numbers are the default 512-bit config (fastest, 100% recall). The 256-bit compact config holds 100% recall at half the memory — 96× less than HNSW — trading ~2× single-query latency.
FaceFlash dominates up to 300K on every axis. At 500K-1M, HNSW edges ahead on single-query latency (O(log N) vs O(N)), but FaceFlash still wins on batched throughput and always uses 48–96× less memory.
1:N Identification - 44,290 Distinct People
The hardest test: one photo per person in the gallery, identify them from a different photo.
1:N Identification on 44,290 Identities: FaceFlash matches FAISS-Flat accuracy at 32× less memory
| Method | Rank-1 Accuracy | Memory |
|---|---|---|
| FAISS-Flat (exact ceiling) | 95.8% | 86.5 MB |
| FaceFlash (512b / 100c) | 95.8% | 2.70 MB |
| FaceFlash (512b / 300c) | 95.8% | 2.70 MB |
| FaceFlash (256b / 100c) | 95.6% | 1.35 MB |
FaceFlash ties exact search using 32× less memory (512 float32 → 512 bits = exactly 32× compression). Binary quantization is lossless at 512 bits.
Detailed per-scale benchmark tables
100K Faces (6,939 identities)
| Method | Recall@1 | Latency | QPS | Memory |
|---|---|---|---|---|
| FaceFlash (batched) | 100% | 0.036ms | 27,661 | 6.1 MB |
| FaceFlash (512b/200c) | 100% | 0.30ms | 3,310 | 6.1 MB |
| FaceFlash (512b/100c) | 100% | 0.43ms | 2,344 | 6.1 MB |
| HNSWLIB (ef=128) | 100% | 0.60ms | 1,671 | 293 MB |
| HNSWLIB batched | 100% | 0.172ms | 5,813 | 293 MB |
| USearch batched | 99.5% | 0.007ms | 137,264 | 254 MB |
| USearch | 99.5% | 0.17ms | -- | 254 MB |
| ScaNN | 98.3% | 0.10ms | -- | 12 MB |
| FAISS-Flat (exact) | 100% | 4.90ms | 204 | 195 MB |
200K Faces (13,749 identities)
| Method | Recall@1 | Latency | QPS | Memory |
|---|---|---|---|---|
| FaceFlash (batched) | 100% | 0.050ms | 19,930 | 12.2 MB |
| FaceFlash (512b/200c) | 100% | 0.57ms | 1,751 | 12.2 MB |
| HNSWLIB (ef=128) | 99.9% | 0.65ms | 1,531 | 586 MB |
| HNSWLIB batched | 99.9% | 0.378ms | 2,646 | 586 MB |
| USearch batched | 99.1% | 0.008ms | 121,660 | 508 MB |
| ScaNN | 97.2% | 0.19ms | -- | 24 MB |
300K Faces (20,615 identities)
| Method | Recall@1 | Latency | QPS | Memory |
|---|---|---|---|---|
| FaceFlash (batched) | 100% | 0.066ms | 15,147 | 18.3 MB |
| FaceFlash (512b/200c) | 100% | 0.84ms | 1,187 | 18.3 MB |
| HNSWLIB (ef=128) | 99.9% | 0.66ms | 1,510 | 879 MB |
| HNSWLIB batched | 99.7% | 0.269ms | 3,715 | 879 MB |
| USearch batched | 98.7% | 0.014ms | 73,383 | 762 MB |
| ScaNN | 97.8% | 0.28ms | -- | 37 MB |
500K Faces (34,328 identities)
| Method | Recall@1 | Latency | QPS | Memory |
|---|---|---|---|---|
| FaceFlash (batched) | 100% | 0.097ms | 10,337 | 30.5 MB |
| FaceFlash (512b/200c) | 100% | 1.45ms | 692 | 30.5 MB |
| HNSWLIB (ef=128) | 100% | 0.71ms | 1,416 | 1,465 MB |
| HNSWLIB batched | 99.9% | 0.179ms | 5,577 | 1,465 MB |
| USearch batched | 98.4% | 0.013ms | 76,150 | 1,270 MB |
| ScaNN | 97.6% | 0.45ms | -- | 61 MB |
1M Faces (44,291 identities)
| Method | Recall@1 | Latency | QPS | Memory |
|---|---|---|---|---|
| FaceFlash (batched) | 100% | 0.185ms | 5,403 | 61 MB |
| FaceFlash (512b/100c) | 100% | 2.92ms | 342 | 61 MB |
| HNSWLIB (ef=128) | 100% | 0.66ms | 1,523 | 2,930 MB |
| HNSWLIB batched | 100% | 0.178ms | 5,621 | 2,930 MB |
| USearch batched | 94.1% | 0.013ms | 77,266 | 2,539 MB |
| ScaNN | 98.2% | 0.86ms | -- | 122 MB |
Tuning
Pick a config that matches your deployment:
| Deployment | Config | Recall@1 | Memory/face | Notes |
|---|---|---|---|---|
| Ultra-compact (mobile/IoT) | n_bits=128, n_candidates=500 | 99.4% | 16 bytes | Minimum RAM |
| Balanced | n_bits=256, n_candidates=100 | 100% | 32 bytes | Good default |
| Default (fastest) | n_bits=512, n_candidates=100 | 100% | 64 bytes | One AVX-512 instruction |
| Edge (minimize disk reads) | n_bits=512, n_candidates=50 | 99.5% | 64 bytes | -- |
ff = FaceFlash(n_bits=128, n_candidates=500) # mobile/IoT
ff = FaceFlash(n_bits=256, n_candidates=100) # balanced
ff = FaceFlash(n_bits=512, n_candidates=100) # default: fastest
ff.search("query.jpg", n_candidates=200) # per-query override
Speed up large indexes with clustering
IVF Clustering Speedup: 5–8× faster at 500K+ with configurable recall trade-off
ff.index.build_clusters(n_probe=16)
| Scale | n_probe | Recall@1 | Latency | Speedup |
|---|---|---|---|---|
| 100K | 16 | 96.1% | 0.12ms | 2.6x |
| 100K | 32 | 98.5% | 0.17ms | 1.8x |
| 500K | 16 | 87.9% | 0.31ms | 5.0x |
| 500K | 32 | 92.8% | 0.56ms | 2.8x |
Clustering is mainly useful at 500K+ where it delivers 5-8x speedup at ~88-93% recall.
Architecture
faceflash/ # Python package
├── engine.py ◀─ High-level API (register, search, verify)
├── detect.py ◀─ Face detection (SCRFD + Haar fallback)
├── align.py ◀─ 5-point alignment to ArcFace template
├── embed.py ◀─ ArcFace ONNX embedding (512-dim, auto-download)
├── index.py ◀─ Binary index + batched search
└── pca_quantize.py ◀─ PCA+ITQ quantizer (the core algorithm)
rust/ # Rust backend (PyO3 + Rayon)
├── src/lib.rs ◀─ AVX-512 VPOPCNTDQ / NEON / scalar POPCNT
└── Cargo.toml
Why PCA+ITQ? ArcFace embeddings concentrate identity information along principal axes. PCA aligns quantization with those axes; ITQ rotates bits for balanced marginals. The result is lossless compression at 512 bits.
Why not HNSW internally? HNSW stores a graph on top of full float vectors — about 1.5x raw memory. FaceFlash stores 32–64 bytes per face. Float vectors are memory-mapped from disk and paged only for the top ~100 candidates per query. Trade-off: higher single-query latency at 500K+, but 48–96× less memory.
Why Rust + AVX-512? AVX-512 VPOPCNTDQ processes an entire 512-bit code in one instruction (~3× faster than scalar POPCNT). Combined with Rayon multi-core parallelism (and cache-blocked batching to keep the scan cache-friendly), batched search reaches 10-17× throughput versus single-query serial. Runtime-detected — no user configuration needed.
Limitations
- Single-query at 1M+ — O(N) linear scan; HNSW is 4.4x faster per single query at 1M. Batched path ties.
- Memory during build — holds all float vectors in RAM. The 48–96× savings apply after
save()/load(). - AVX-512 VPOPCNTDQ — the ~3× kernel speedup requires Ice Lake / Zen 4+ / EPYC 9004+. Older CPUs fall back to scalar POPCNT automatically.
- Rerank I/O — pages ~100 float rows from disk per query. Invisible on NVMe; adds latency on slow storage.
Reproduce the Benchmarks
# Local (LFW + VGGFace2 100K)
python scripts/extract_lfw_embeddings.py
python benchmarks/bench_ann_comparison.py --scales 100K --queries 500
# RunPod (full suite)
export GITHUB_TOKEN=<token>
bash scripts/runpod_ms1m.sh # FORCE_EXTRACT=1 for full 85K extraction
Roadmap
v0.1.0 (current)
- PCA+ITQ binary quantization + Rust search backend
- High-level API: register, search, verify
- Benchmarked against FAISS, HNSWLIB, USearch, ScaNN at 100K-1M
- 1:N identification on 44,290 distinct identities (MS1MV2)
- 5-point alignment via SCRFD/RetinaFace — 99.85% LFW accuracy
v0.2.0 (done)
- Prebuilt wheels (
pip install faceflash) - Full 85K-identity benchmark (76,872 identities extracted, 44,291 with sufficient data)
- On-device memory measurement (3.05 MB binary index @100K with 256b)
v0.3.0 (done)
- IVF coarse clustering (2.7-4.9x speedup at scale)
- AVX-512 VPOPCNTDQ — native 512-bit popcount (~3x faster than scalar)
- Batched search — 17x throughput at 500K-1M (multi-core + VPOPCNTDQ; cache-blocked)
- NEON kernels — ARM-optimized (vcntq_u8)
v1.0.0 — next
- Stable public API (no breaking changes)
- DiskANN comparison
- Mobile deployment (ONNX + CoreML)
- Streaming insertion (add faces without refitting PCA)
Contributing
# Dev setup (one command)
git clone https://github.com/raghavenderreddygrudhanti/faceflash.git
cd faceflash && python -m venv .venv && source .venv/bin/activate
pip install -e ".[cpu,benchmark]" && maturin develop --release
python -m pytest tests/ # 33 tests, ~17s
Open areas for contribution:
| Area | Difficulty | Impact |
|---|---|---|
| DiskANN comparison | Medium | High — the one competitor missing |
| Mobile deployment (ONNX + CoreML) | Medium | High — iOS/Android face search |
| Streaming insertion (no PCA refit) | Hard | High — online learning |
| GPU batched search (CUDA) | Hard | Medium — 10M+ galleries |
| Raspberry Pi / Jetson benchmarks | Easy | Medium — edge credibility |
| WebAssembly build | Medium | Medium — browser face search |
See CONTRIBUTING.md for coding guidelines.
Credits & References
FaceFlash does not introduce a new embedding model or hashing algorithm. It combines proven, published techniques into a CPU-efficient retrieval system — with hand-written Rust AVX-512/NEON kernels, cache-blocked batching, and rigorous, reproducible benchmarks. The contribution is the system (exact-recall face search in a megabyte-scale footprint) and the honest measurement of it, not the underlying math.
It builds directly on:
| Component | Reference |
|---|---|
| Binary quantization (PCA + ITQ — the core method) | Gong & Lazebnik, "Iterative Quantization: A Procrustean Approach to Learning Binary Codes," CVPR 2011 |
| Face embeddings | Deng, Guo, Xue & Zafeiriou, "ArcFace: Additive Angular Margin Loss for Deep Face Recognition," CVPR 2019 — weights from InsightFace |
| Detection & 5-point alignment | RetinaFace (CVPR 2020) / SCRFD (ICLR 2022), InsightFace |
| Dataset | Guo et al., "MS-Celeb-1M," ECCV 2016 (MS1MV2 = ArcFace's refined/cleaned version) |
| Verification benchmark | Huang et al., "Labeled Faces in the Wild (LFW)," UMass TR 2007 |
| Baselines compared | FAISS (Johnson et al.), HNSW (Malkov & Yashunin, TPAMI 2018), ScaNN (Guo et al., ICML 2020), USearch |
PCA dates to Pearson (1901) / Hotelling (1933); the Hamming distance to Hamming (1950); POPCNT / VPOPCNTDQ are Intel/AMD hardware instructions. FaceFlash's value is in how these are combined and implemented — not in inventing them.
License
MIT — see LICENSE.
If FaceFlash is useful to you, a star helps others find it.
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 faceflash-0.1.0.tar.gz.
File metadata
- Download URL: faceflash-0.1.0.tar.gz
- Upload date:
- Size: 33.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f890ca970f68ea64c9236dbe33266064afc19bd9a18176845cfb09a0fa119739
|
|
| MD5 |
5c04a727711da9d0b0ba2e7a8ce212d2
|
|
| BLAKE2b-256 |
6194cce69ea61868723a4bffd26754fc526af33c9c942e0fa2de6ba37e9951df
|
File details
Details for the file faceflash-0.1.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 214.3 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
654abddabb892f4f63ec63b2a4577ad5c464acd822761de256ebe443a793f06f
|
|
| MD5 |
6908822426687a9ba39c937ffd888758
|
|
| BLAKE2b-256 |
41762922f76ae6eac5308b211f81ac5c96d8bc9d3e059e4ad549153395fb4b79
|
File details
Details for the file faceflash-0.1.0-cp313-cp313-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp313-cp313-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 338.2 kB
- Tags: CPython 3.13, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0ca47578d32301ba8acb7be48b57b1bb1b3570c323c802c3c50dcd81141b8a6c
|
|
| MD5 |
78ac5412faf7509e414310b8a4c541a7
|
|
| BLAKE2b-256 |
cc5d3582c3f340572b52630446ef3cc66c753c1cb951c883ec27a7ec584db817
|
File details
Details for the file faceflash-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 297.2 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
654ecb15f55b4b65b2f766a21808433d5c7437edba8fe8a70e94c2c7897f21ed
|
|
| MD5 |
4ce94075225efd9e5bb2728c201c7893
|
|
| BLAKE2b-256 |
6a84d86c43769e30afb516ab7402ffdac494eb673223aa1272780c6af7683d65
|
File details
Details for the file faceflash-0.1.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 214.7 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ce647784fc5055bcdcbf4a8fb56733d95f36fa3bc3be7fab0dbe27019ae29cd
|
|
| MD5 |
a4615243905e4ed421943acdd17a53e5
|
|
| BLAKE2b-256 |
20fdf5b6ff58ca2b8de6c67908c38c89e8c7021d6abcaef8ebe2c6091db4d2b8
|
File details
Details for the file faceflash-0.1.0-cp312-cp312-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp312-cp312-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 338.8 kB
- Tags: CPython 3.12, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38796afd64869ac602367c663b575dfeb46d3066fa09298f05aea6a54d0987e2
|
|
| MD5 |
ce8fc8e4c01de6775a4fd93967dcc233
|
|
| BLAKE2b-256 |
23dcb5bd8a43aa85a56514c1fe0180b96913e46a13f146ae7f93ae18e3067a43
|
File details
Details for the file faceflash-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 297.6 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2e6e28f95f88c135718e661fa80e634e403f57fb7eb420a99ed2ce59aab4950
|
|
| MD5 |
4e79350a53e40f7e2c159f6504888b4f
|
|
| BLAKE2b-256 |
29ba0e880cda6f7abcafdbdcca1be22232d84555db7add4a55ba5d9e4b809e4d
|
File details
Details for the file faceflash-0.1.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 213.8 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
552d17418a82ac1001e068e7e643f94246f690fce33bdee13d7826ce87e2ec41
|
|
| MD5 |
5e15e338f14c4bb3f513a0f9caff7501
|
|
| BLAKE2b-256 |
f41147c061fd8c03b9b677a751193d7308958428b9f81fef7f67a42df842fe0a
|
File details
Details for the file faceflash-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp311-cp311-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 337.9 kB
- Tags: CPython 3.11, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0f11162b6299c8220334982a7bd8f1a51f6de6c58f8262d55139bf6cc23f199
|
|
| MD5 |
504022306d6dbd6955bae69edee1703f
|
|
| BLAKE2b-256 |
862a6b1b9b641fbcd3a2ce319a65560d8fb8c318c2ee3f5d62bfa15a1629085f
|
File details
Details for the file faceflash-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 297.7 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4d81f2782343c90a135d125f9b0e8bd05225136f7be47cfbb7ec83d9bd9f4de
|
|
| MD5 |
64c80cf9820bb565c54551a295d1b564
|
|
| BLAKE2b-256 |
9ed7398ce32af7bd2c76c2283c0aa325f4ad4db6e7fba9e41ea448c8cc9d69e7
|
File details
Details for the file faceflash-0.1.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 214.0 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2147cd78d11fef1aed6eebe25bf3a7c1fa47fc52639fb8b573a6b58229b68a1e
|
|
| MD5 |
2a843069024393bc94d99628574110d7
|
|
| BLAKE2b-256 |
ef0404b0537a97e6430d56768727c7c9525bf4e7db4bc9d8f6f36a62148eed5b
|
File details
Details for the file faceflash-0.1.0-cp310-cp310-manylinux_2_34_x86_64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp310-cp310-manylinux_2_34_x86_64.whl
- Upload date:
- Size: 338.1 kB
- Tags: CPython 3.10, manylinux: glibc 2.34+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a0907a21ad0f4c08cb985f9358fad67fa403e53883433d20652fbf976d56828
|
|
| MD5 |
4924e8f315e371df4333c90586711099
|
|
| BLAKE2b-256 |
2a977accb26a04097e76abdd7a309747dfb494f7819c8c0d647b2cf12789b35b
|
File details
Details for the file faceflash-0.1.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: faceflash-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 297.8 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: maturin/1.14.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d2a1098402f921912ac9b3c00ed9d98655aefc3f111bb7c51eb8f0cbe3a34ab
|
|
| MD5 |
06284b636d5a64e77c15ec9c314ef240
|
|
| BLAKE2b-256 |
0220d07c98dbba0ef80bcb0cc568c061138af46624fc21aa79a28a84ef992c35
|