Skip to main content

Crash-safe embedded key-value store — encryption (XChaCha20-Poly1305), TTL, reverse iterators, iterator seek, put_if_absent, column families, ACID transactions, vector search (HNSW), snkvctl CLI

Project description

SNKV Python Bindings

Build PyPI License

Idiomatic Python 3.8+ bindings for SNKV — a lightweight, ACID-compliant embedded key-value store built directly on SQLite's B-Tree engine.

If you find it useful, a ⭐ on GitHub goes a long way!


Features

  • snkvctl CLI — installed automatically; full command-line access to every SNKV API (put, get, scan, txn, stats, cf, encrypt, and more)
  • Dict-style APIdb["key"] = value, val = db["key"], del db["key"], "key" in db
  • Context managerswith KVStore(...) as db and with db.create_column_family(...) as cf for guaranteed cleanup
  • Prefix iterators — efficient namespace scans with db.prefix_iterator(b"user:")
  • Reverse iterators — walk keys in descending order with db.reverse_iterator() and db.reverse_prefix_iterator(b"user:")
  • WAL checkpoint control — PASSIVE / FULL / RESTART / TRUNCATE modes via db.checkpoint()
  • Auto-checkpoint — set wal_size_limit=N to checkpoint automatically after every N WAL frames
  • Typed exceptionsNotFoundError, BusyError, LockedError, ReadOnlyError, CorruptError all subclass snkv.Error
  • No Python dependencies — pure CPython C extension; only requires a C compiler and python3-dev
  • Native TTL — per-key expiry with put(ttl=seconds), dict-style db[key, ttl] = value, lazy expiry on get, and purge_expired()
  • Encryption — per-value XChaCha20-Poly1305 encryption with Argon2id key derivation; transparent to all existing APIs
  • Seek iterators — jump to any key in O(log N) with it.seek(key), chainable and works on prefix/reverse iterators
  • Conditional insert — atomic put_if_absent(key, value, ttl=None) returns True if inserted; safe for distributed locks and dedup
  • Bulk cleardb.clear() / cf.clear() truncates all keys in O(pages) without dropping the store
  • Key countdb.count() / cf.count() returns entry count in O(pages); CF counts are fully isolated
  • Extended statsdb.stats() exposes 12 counters including bytes_read, bytes_written, wal_commits, ttl_expired, db_pages; reset with db.stats_reset()
  • Vector search — integrated HNSW approximate nearest-neighbour index via snkv[vector]; sidecar persistence, quantization (f32/f16/i8), metadata filtering, exact rerank, TTL on vectors, and encryption support
  • 599 tests — full pytest suite covering ACID, WAL, crash recovery, concurrency, column families, TTL, encryption, and vector search

Installation

From PyPI (recommended)

Pre-built binary wheels are available for Linux, macOS, and Windows — no compiler needed.

Windows / macOS:

pip install snkv

Linux (Debian/Ubuntu):

python3 -m venv .venv
source .venv/bin/activate
pip install snkv

Linux system Python is "externally managed" (PEP 668) and blocks system-wide pip installs. Use a virtual environment.

Build from Source

# System dependencies
sudo apt-get install -y build-essential python3-dev python3-pip

# Python build dependencies
pip3 install setuptools wheel pytest

# Build
cd python
python3 setup.py build_ext --inplace

macOS

# Compiler (skip if already installed)
xcode-select --install

# Python build dependencies
pip3 install setuptools wheel pytest

# Build
cd python
python3 setup.py build_ext --inplace

Windows — Native Python (recommended)

  1. Install Python 3.8+ — check "Add Python to PATH"
  2. Install Visual Studio Build Tools — select "Desktop development with C++"
  3. Open "x64 Native Tools Command Prompt for VS 2022" from the Start Menu (required for 64-bit Python; "Developer PowerShell for VS" defaults to 32-bit and will fail)
:: Python build dependencies
pip install setuptools wheel pytest

:: Build
cd python
python setup.py build_ext --inplace

Windows — MSYS2 MinGW64 shell

Open the MSYS2 MinGW64 shell (not plain MSYS2, not cmd.exe):

# System + Python dependencies (one-time)
pacman -S --needed mingw-w64-x86_64-python \
                   mingw-w64-x86_64-python-pip \
                   mingw-w64-x86_64-python-setuptools \
                   mingw-w64-x86_64-python-pytest

# Build
cd python
python3 setup.py build_ext --inplace

On all platforms, setup.py automatically locates snkv.h — no manual header step needed. On Linux/macOS it regenerates it via make snkv.h; on Windows it falls back to the pre-built snkv.h included in the repo.


Quick Start

from snkv import KVStore

with KVStore("mydb.db") as db:
    db["hello"] = "world"
    print(db["hello"].decode())   # world

API Reference

Opening a store

from snkv import KVStore, JOURNAL_WAL, JOURNAL_DELETE, SYNC_NORMAL, SYNC_OFF, SYNC_FULL

with KVStore(
    "mydb.db",
    journal_mode=JOURNAL_WAL,   # JOURNAL_WAL (default) or JOURNAL_DELETE
    sync_level=SYNC_NORMAL,     # SYNC_NORMAL (default), SYNC_OFF, SYNC_FULL
    cache_size=2000,            # pages (~8 MB default)
    page_size=4096,             # bytes; new databases only
    busy_timeout=5000,          # ms to retry on SQLITE_BUSY (default 0)
    read_only=False,            # open read-only
    wal_size_limit=100,         # auto-checkpoint every 100 WAL frames (0 = off)
) as db:
    ...

CRUD

# Write
db["key"] = b"value"          # bytes or str keys/values are both accepted
db["key"] = "value"           # str is UTF-8 encoded automatically

# Read
val = db["key"]               # returns bytes; raises NotFoundError if missing
val = db.get("key")           # returns bytes or None
val = db.get("key", b"def")   # with default

# Check existence
exists = "key" in db
exists = db.exists(b"key")

# Delete
del db["key"]
db.delete(b"key")             # same as del; no error if key absent

# Upsert
db.put(b"key", b"value")      # identical to db["key"] = value

Transactions

db.begin(write=True)
db["a"] = "1"
db["b"] = "2"
db.commit()          # persist

db.begin(write=True)
db["c"] = "3"
db.rollback()        # discard — "c" is never written

Auto-commit is the default: each db["key"] = value outside an explicit transaction is committed immediately.

Column Families

Logical namespaces within a single database file. Always close cf before db.

# Create (first use)
with db.create_column_family("users") as cf:
    cf[b"alice"] = b"admin"
    cf[b"bob"]   = b"viewer"

# Open (subsequent uses)
with db.open_column_family("users") as cf:
    print(cf[b"alice"])       # b"admin"

# List all column families
names = db.list_column_families()   # ["users", ...]

# Drop
db.drop_column_family("users")

Iterators

# Full scan — yields (key, value) tuples in key order
for key, value in db.iterator():
    print(key, value)

# Prefix scan
for key, value in db.prefix_iterator(b"user:"):
    print(key, value)

# Manual control
it = db.iterator()
it.first()
while not it.eof:
    print(it.key, it.value)
    it.next()
it.close()

# As a context manager
with db.iterator() as it:
    for key, value in it:
        ...

Reverse Iterators

Walk keys in descending order — no full scan, no sort, pure B-tree traversal.

# Full reverse scan
for key, value in db.reverse_iterator():
    print(key, value)

# Reverse prefix scan — visits only matching keys, largest first
for key, value in db.reverse_prefix_iterator(b"user:"):
    print(key, value)

# Manual control
it = db.reverse_iterator()
it.last()
while not it.eof:
    print(it.key, it.value)
    it.prev()
it.close()

# As a context manager
with db.reverse_prefix_iterator(b"log:") as it:
    for key, value in it:
        ...

Column families support reverse iterators identically via cf.reverse_iterator() and cf.reverse_prefix_iterator().

WAL Checkpoint

from snkv import CHECKPOINT_PASSIVE, CHECKPOINT_FULL, CHECKPOINT_RESTART, CHECKPOINT_TRUNCATE

# Returns (nLog, nCkpt) — WAL frames total / frames written to DB
nlog, nckpt = db.checkpoint(CHECKPOINT_PASSIVE)    # copy frames without blocking
nlog, nckpt = db.checkpoint(CHECKPOINT_FULL)       # wait for writers, flush all
nlog, nckpt = db.checkpoint(CHECKPOINT_RESTART)    # like FULL, reset write position
nlog, nckpt = db.checkpoint(CHECKPOINT_TRUNCATE)   # like RESTART, truncate WAL file

Must be called outside an active write transaction. Use wal_size_limit to auto-checkpoint instead.

Iterator Seek

Jump to any position in O(log N) without scanning from the start.

with db.iterator() as it:
    it.seek(b"user:bob")        # forward: position at first key >= target
    while not it.eof:
        print(it.key, it.value)
        it.next()

with db.iterator(reverse=True) as it:
    it.last()
    it.seek(b"user:bob")        # reverse: position at last key <= target
    while not it.eof:
        print(it.key, it.value)
        it.prev()

# Works on prefix iterators too — boundary still enforced
with db.iterator(prefix=b"user:") as it:
    it.seek(b"user:carol")      # skip straight to "user:carol"
    while not it.eof:
        print(it.key)
        it.next()

# seek() returns self for chaining
key = db.iterator().seek(b"target").key

Conditional Insert

Atomically insert a key only when it is absent — safe for distributed locks and deduplication.

# Returns True if inserted, False if the key already existed.
inserted = db.put_if_absent(b"lock", b"owner:alice")

# With TTL — the key auto-releases after the given number of seconds.
inserted = db.put_if_absent(b"session:42", b"token-xyz", ttl=30)

# Column families support the same method.
with db.create_column_family("dedup") as cf:
    if cf.put_if_absent(b"msg:001", b"hello"):
        process(b"msg:001")     # only the first caller reaches here

Bulk Clear

Truncate all entries from a store or column family in O(pages) — no iterating, no individual deletes.

db.clear()      # remove every key from the default CF

with db.create_column_family("cache") as cf:
    cf.clear()  # only this CF is affected; other CFs are untouched

TTL index entries are cleared atomically alongside data entries. Close all iterators before calling clear().

Key Count

Count entries without scanning individual keys.

n = db.count()                           # total entries in the default CF

with db.open_column_family("users") as cf:
    n = cf.count()                       # only this CF; TTL index not counted

# count() includes expired-but-not-yet-purged keys.
# Call purge_expired() first for an accurate live count.
db.purge_expired()
n = db.count()

Maintenance

db.sync()                 # flush OS write buffers (fsync)
db.vacuum(100)            # reclaim up to 100 unused pages incrementally
db.integrity_check()      # raises CorruptError if database is corrupt

# Extended stats — 12 counters
stats = db.stats()
# Keys: puts, gets, deletes, iterations, errors,
#       bytes_read, bytes_written, wal_commits, checkpoints,
#       ttl_expired, ttl_purged, db_pages

# Reset all cumulative counters (db_pages is always live)
db.stats_reset()

TTL — Native Key Expiry

Per-key TTL with automatic lazy expiry on read.

# Put with TTL (seconds, float precision)
db.put(b"session", b"tok123", ttl=60)   # expires in 60 s
db[b"token", 30] = b"bearer-xyz"        # dict-style shorthand

# Get — expired keys are silently evicted and raise NotFoundError
val = db.get(b"session")                # returns bytes or None if expired

# Check remaining lifetime
from snkv import NotFoundError
try:
    remaining = db.ttl(b"session")      # seconds remaining (float)
except NotFoundError:
    remaining = None                    # key expired or never set

# Purge all expired keys from disk (returns count removed)
n = db.purge_expired()

# Column families support TTL identically
with db.create_column_family("cache") as cf:
    cf.put(b"item", b"data", ttl=10)
    cf[b"item2", 5] = b"data2"
    n = cf.purge_expired()

Encryption

Transparent per-value encryption. All existing APIs work without modification.

from snkv import KVStore, AuthError

# Create / open encrypted store
with KVStore.open_encrypted("mydb.db", b"hunter2") as db:
    db[b"secret"] = b"classified"
    print(db.is_encrypted())      # True
    print(db[b"secret"])          # b"classified" — transparent decrypt

# Wrong password raises AuthError
try:
    KVStore.open_encrypted("mydb.db", b"wrong")
except AuthError:
    print("bad password")

# Change password in-place (re-encrypts all values atomically)
with KVStore.open_encrypted("mydb.db", b"hunter2") as db:
    db.reencrypt(b"new-strong-pass")

# Remove encryption permanently
with KVStore.open_encrypted("mydb.db", b"new-strong-pass") as db:
    db.remove_encryption()
with KVStore("mydb.db") as db:    # plain open works now
    print(db[b"secret"])
Method Description
KVStore.open_encrypted(path, password, **kwargs) Class method — open or create encrypted store
db.is_encrypted() Returns True if store is encrypted
db.reencrypt(new_password) Change password; re-encrypts all values atomically
db.remove_encryption() Decrypt in-place; store becomes plain

Cryptographic details: XChaCha20-Poly1305 per value · Argon2id KDF (64 MB, 3 iterations) · 40-byte overhead per value (nonce + MAC) · key wiped from memory on close.


Vector Search

Integrated HNSW approximate nearest-neighbour index backed by usearch. All vectors and KV data live in the same .db file — no separate index file, no external service.

Installation

pip install snkv[vector]

Quick Start

from snkv.vector import VectorStore
import numpy as np

with VectorStore("store.db", dim=128, space="cosine") as vs:
    vs.vector_put(b"doc:1", b"hello world", np.random.rand(128).astype("f4"))
    results = vs.search(np.random.rand(128).astype("f4"), top_k=5)
    for r in results:
        print(r.key, r.distance, r.value)

Parameters

Parameter Default Description
path Path to .db file. None for in-memory.
dim Vector dimension. Fixed for the lifetime of the store.
space "l2" Distance metric: "l2" (squared L2), "cosine", or "ip" (inner product).
connectivity 16 HNSW M parameter.
expansion_add 128 HNSW expansion during index build.
expansion_search None HNSW expansion at query time. None restores the stored value (default 64).
dtype "f32" In-memory index precision: "f32", "f16" (half RAM), or "i8" (quarter RAM). On-disk storage is always float32.
password None Open/create an encrypted store. Sidecar is disabled for encrypted stores.

Quantization

dtype controls the in-memory HNSW graph precision only — on-disk storage in _snkv_vec_ is always float32.

dtype RAM per vector (dim=768) Notes
"f32" 3072 bytes Full precision (default)
"f16" 1536 bytes Half RAM, negligible recall loss
"i8" 768 bytes Quarter RAM, small recall cost

For 1 M vectors at dim=768: f32 ≈ 3 GB → f16 ≈ 1.5 GB → i8 ≈ 768 MB.

# Half RAM for the in-memory index; on-disk vectors still float32
with VectorStore("store.db", dim=768, space="cosine", dtype="f16") as vs:
    vs.vector_put(b"doc:1", b"hello", np.random.rand(768).astype("f4"))

Index Persistence (Sidecar)

For unencrypted file-backed stores, the HNSW index is saved to {path}.usearch on close() and reloaded on the next open — skipping the O(n×d) CF rebuild. A companion {path}.usearch.nid stamp file detects any write that occurred after the last clean close (including crash scenarios). Stale or corrupt sidecars are silently discarded and the index is rebuilt from the column families.

Encrypted stores and in-memory stores always rebuild from column families.

Key Methods

# Write
vs.vector_put(b"key", b"value", vec, ttl=None, metadata=None)
vs.vector_put_batch([(b"key", b"value", vec), ...], ttl=None)

# Search
results = vs.search(query_vec, top_k=10)                           # ANN
results = vs.search(query_vec, top_k=10, filter={"topic": "ml"})  # metadata filter
results = vs.search(query_vec, top_k=10, rerank=True)             # exact rerank
results = vs.search(query_vec, top_k=10, max_distance=0.5)        # distance cutoff
pairs   = vs.search_keys(query_vec, top_k=10)                     # keys + distances only

# SearchResult fields: key, value, distance, metadata
# NOTE: result.metadata is None unless filter= is passed to search().
# To access metadata without filtering, call get_metadata(key) after the search:
for r in results:
    meta = vs.get_metadata(r.key)   # dict or None — always works

# Read
vec  = vs.vector_get(b"key")          # np.ndarray(dim,) float32
val  = vs.get(b"key")                 # value bytes from KV store
meta = vs.get_metadata(b"key")        # dict or None

# Delete / maintenance
vs.delete(b"key")
n = vs.vector_purge_expired()         # remove expired vectors from index + CFs

# Stats
stats = vs.vector_stats()
# Keys: dim, space, dtype, connectivity, expansion_add, expansion_search,
#       count, capacity, fill_ratio, vec_cf_count, has_metadata, sidecar_enabled

# Drop index (KV data preserved)
vs.drop_vector_index()

Encrypted Vector Store

from snkv import AuthError

with VectorStore("store.db", dim=128, password=b"secret") as vs:
    vs.vector_put(b"doc:1", b"classified", np.random.rand(128).astype("f4"))

try:
    VectorStore("store.db", dim=128, password=b"wrong")
except AuthError:
    print("bad password")

Error Hierarchy

snkv.Error (base)
├── snkv.NotFoundError       (also KeyError — raised by db["missing"])
├── snkv.BusyError           (SQLITE_BUSY — another writer holds the lock)
├── snkv.LockedError         (SQLITE_LOCKED)
├── snkv.ReadOnlyError       (write attempted on read-only store)
├── snkv.CorruptError        (database file is corrupt)
└── snkv.AuthError           (wrong password or not an encrypted store)

snkv.vector.VectorIndexError  (index dropped or empty; not a subclass of snkv.Error)
import snkv

try:
    val = db["missing_key"]
except snkv.NotFoundError:
    val = b"default"

try:
    db["key"] = b"value"
except snkv.BusyError:
    # retry after a delay
    ...

Running Tests

Linux / macOS

cd python
python3 -m pytest tests/ -v

Windows — Native Python (x64 Native Tools Command Prompt for VS 2022)

cd python
set PYTHONPATH=.
python -m pytest tests\ -v

Windows — MSYS2 MinGW64 shell

cd python
PYTHONPATH=. python3 -m pytest tests/ -v

All 599 tests should pass.


Running Examples

Linux / macOS

cd python
PYTHONPATH=. python3 examples/basic.py           # CRUD, binary data, in-memory store
PYTHONPATH=. python3 examples/transactions.py    # begin/commit/rollback
PYTHONPATH=. python3 examples/column_families.py # logical namespaces
PYTHONPATH=. python3 examples/iterators.py       # ordered scan, prefix scan
PYTHONPATH=. python3 examples/config.py          # journal mode, sync, cache, WAL limit
PYTHONPATH=. python3 examples/checkpoint.py      # manual + auto WAL checkpoint
PYTHONPATH=. python3 examples/session_store.py   # real-world session store pattern
PYTHONPATH=. python3 examples/ttl.py             # TTL expiry, rate limiter demo
PYTHONPATH=. python3 examples/encryption.py  # encrypted store, wrong-password, reencrypt
PYTHONPATH=. python3 examples/iterator_reverse.py # reverse iterators, descending scans
PYTHONPATH=. python3 examples/new_apis.py        # seek, put_if_absent, clear, count, stats
PYTHONPATH=. python3 examples/multiprocess.py    # 5 concurrent processes, busy_timeout
PYTHONPATH=. python3 examples/vector.py          # vector search, quantization, sidecar, TTL, encryption

Windows — Native Python (x64 Native Tools Command Prompt for VS 2022)

cd python
set PYTHONPATH=.
python examples\basic.py
python examples\transactions.py
python examples\column_families.py
python examples\iterators.py
python examples\config.py
python examples\checkpoint.py
python examples\session_store.py
python examples\ttl.py
python examples\encryption.py
python examples\iterator_reverse.py
python examples\new_apis.py
python examples\multiprocess.py
python examples\all_apis.py
python examples\vector.py

Windows — MSYS2 MinGW64 shell

cd python
PYTHONPATH=. python3 examples/basic.py
PYTHONPATH=. python3 examples/transactions.py
# ... same pattern for all examples

snkvctl CLI

snkvctl is a command-line interface for SNKV databases, installed automatically alongside the Python package. It gives you shell-level access to every SNKV API — useful for inspecting databases, debugging, scripting, and administration.

pip install snkv          # snkvctl is included; no separate install needed
snkvctl --help

Usage

snkvctl --db PATH [options] COMMAND [args]

Global flags

Flag Default Description
--db PATH Database file (required)
--cf NAME default CF Target column family
--password PASS Open as encrypted store
--timeout MS 3000 Busy-retry timeout in ms
--format text|json text Output format
--journal wal|delete wal Journal mode
--sync off|normal|full normal fsync level
--cache-size N 2000 Page cache size (pages)
--page-size N 4096 DB page size (new DBs only)
--read-only off Open read-only
--wal-limit N 0 Auto-checkpoint every N commits
--full-mutex off Recursive mutex (shared-handle threading)

Commands

Command Description
put KEY VALUE [--ttl S] Insert or update
get KEY Fetch value
del KEY Delete single key (exit 2 if missing)
del --prefix P Delete all keys with prefix (commits every 10K keys; not a single atomic op for very large sets)
exists KEY Check existence (exit 0=found, 2=missing)
list [--prefix P] [--seek KEY] [--reverse] [--limit N] Print keys
scan [--prefix P] [--seek KEY] [--reverse] [--limit N] Print key+value pairs
count [--prefix P] Count entries
clear Delete all keys in store or CF
set-if-absent KEY VALUE [--ttl S] Insert only if key is absent
ttl KEY Remaining TTL in seconds
purge Delete all expired keys
txn [--dry-run] [--cf NAME] Atomic batch (put/del ops from stdin)
sync Flush to disk (fsync)
cf list|create|drop [NAME] Column family management
stats [--reset] Operation statistics
checkpoint [--mode passive|full|restart|truncate] WAL checkpoint
vacuum [--pages N] Reclaim unused pages
check Integrity check
info Path, encryption status, CF list, size
encrypt --new-password PASS Migrate plaintext → encrypted (in-place)
decrypt Remove encryption (requires --password)
rekey --new-password NEW Change encryption password

Examples

# Basic round-trip
snkvctl --db mydb.db put hello world
snkvctl --db mydb.db get hello          # → world

# Prefix scan with JSON output
snkvctl --db mydb.db scan --prefix user: --format json

# TTL
snkvctl --db mydb.db put session tok --ttl 300
snkvctl --db mydb.db ttl session        # → 299.987s remaining

# Column families
snkvctl --db mydb.db cf create users
snkvctl --db mydb.db --cf users put alice admin
snkvctl --db mydb.db --cf users scan

# Atomic multi-key update
printf 'put counter 42\nput flag on\ndel old_key\n' \
  | snkvctl --db mydb.db txn

# Encrypted store
snkvctl --db enc.db encrypt --new-password s3cr3t
snkvctl --db enc.db --password s3cr3t put k v
snkvctl --db enc.db --password s3cr3t get k

# Admin
snkvctl --db mydb.db stats --format json
snkvctl --db mydb.db check
snkvctl --db mydb.db info
snkvctl --db mydb.db checkpoint --mode full

Exit codes

Code Meaning
0 Success
1 Error (I/O, bad args, wrong password, corruption, busy timeout)
2 Not found (key missing — useful in shell if checks)

Benchmarks

Benchmarks run on Windows 11 comparing SNKV against diskcache 5.6.3.

Run it yourself:

pip install diskcache
cd python
PYTHONIOENCODING=utf-8 python examples/benchmark_diskcache.py

Core Operations — N = 10,000 ops, 64-byte values

Operation SNKV diskcache Speedup
Bulk write (batched tx) 24.4 ms 649.6 ms 26.6x
Individual write 189.2 ms 2.02 s 10.7x
Read — hit (100%) 19.5 ms 178.7 ms 9.2x
Read — miss (100%) 18.1 ms 170.3 ms 9.4x
Delete (batched tx) 25.1 ms 250.8 ms 10.0x
Full scan (key + value) 7.3 ms 31.8 ms 4.4x
Write with TTL 68.7 ms 636.5 ms 9.3x

Prefix Scan — 10,000 keys, 1,000 matching ns3:

SNKV uses a native prefix_iterator that visits only matching keys. diskcache has no native prefix support and scans all keys in Python.

Operation SNKV diskcache Speedup
Forward prefix scan 3.0 ms 94.7 ms 31.7x
Reverse prefix scan 2.8 ms 93.7 ms 33.4x

Mixed Workload — 80% read / 20% write, 10,000 ops

Operation SNKV diskcache Speedup
80% read / 20% write 57.5 ms 575.0 ms 10.0x

Value Size Scaling — N = 5,000 ops

Size Op SNKV diskcache Speedup
64 B write 11.5 ms 369.7 ms 32.2x
64 B read 10.7 ms 95.3 ms 8.9x
1 KB write 294.3 ms 400.6 ms 1.4x
1 KB read 288.1 ms 103.2 ms 0.4x
10 KB write 769.3 ms 914.3 ms 1.2x
10 KB read 746.8 ms 156.4 ms 0.2x
100 KB write 5.98 s 7.03 s 1.2x
100 KB read 5.77 s 1.33 s 0.2x

For large values (≥ 1 KB) diskcache's read path becomes competitive because pickle overhead shrinks relative to I/O cost. SNKV retains its write advantage at every size.

Large Dataset — N = 100,000 keys, 64-byte values

Operation SNKV diskcache Speedup
Bulk write (batched tx) 217.7 ms 5.05 s 23.2x
Read (10,000 sampled) 35.3 ms 186.1 ms 5.3x
Full scan (key + value) 50.1 ms 199.1 ms 4.0x

Durability — Write → Close → Reopen → Verify, N = 10,000 keys

Library Test Write Reopen + Read Verified
SNKV Plain write 31.7 ms 22.0 ms 10,000 / 10,000 ✓
diskcache Plain write 741.6 ms 175.2 ms 10,000 / 10,000 ✓
SNKV Write with TTL 129.6 ms 30.1 ms 10,000 / 10,000 ✓
diskcache Write with TTL 717.3 ms 177.5 ms 10,000 / 10,000 ✓

Write speedup: 23.4x (plain) · 5.5x (TTL). Both stores verified all keys correctly after a cold reopen.

Overall: SNKV faster in 20 / 23 tests — average speedup 11.1x


Thread Safety

Each thread must use its own KVStore instance. WAL mode serialises concurrent writers at the SQLite level — a BusyError is raised (or retried up to busy_timeout ms) when two writers collide. Multiple readers always make progress concurrently in WAL mode.

import threading
from snkv import KVStore, JOURNAL_WAL

def worker(db_path, worker_id):
    # Each thread opens its own connection
    with KVStore(db_path, journal_mode=JOURNAL_WAL, busy_timeout=5000) as db:
        db[f"key_{worker_id}".encode()] = b"value"

threads = [threading.Thread(target=worker, args=("mydb.db", i)) for i in range(4)]
for t in threads: t.start()
for t in threads: t.join()

Third-Party Licenses

The snkv Python package embeds the following third-party libraries compiled into its native extension:

Library Version License Notes
SQLite 3.x (amalgamation subset) Public Domain B-tree, pager, WAL, OS layer
Monocypher 4.x CC0-1.0 (Public Domain) XChaCha20-Poly1305 + Argon2id
usearch ≥ 2.9 Apache 2.0 HNSW vector index (optional — pip install snkv[vector])

SQLite and Monocypher are statically linked into the extension module — no separate installation required.

SQLite and Monocypher are public domain — no attribution is legally required, but credit is given here in the spirit of good practice. usearch is an optional runtime dependency and is not bundled.


License

Apache License 2.0 © 2025 Hash Anu

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

snkv-0.8.2.tar.gz (106.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

snkv-0.8.2-cp313-cp313-win_amd64.whl (224.4 kB view details)

Uploaded CPython 3.13Windows x86-64

snkv-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.3 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.8 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp313-cp313-macosx_11_0_arm64.whl (275.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

snkv-0.8.2-cp313-cp313-macosx_10_13_x86_64.whl (286.1 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

snkv-0.8.2-cp312-cp312-win_amd64.whl (224.4 kB view details)

Uploaded CPython 3.12Windows x86-64

snkv-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl (276.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

snkv-0.8.2-cp312-cp312-macosx_10_13_x86_64.whl (286.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

snkv-0.8.2-cp311-cp311-win_amd64.whl (224.3 kB view details)

Uploaded CPython 3.11Windows x86-64

snkv-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl (275.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

snkv-0.8.2-cp311-cp311-macosx_10_9_x86_64.whl (285.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

snkv-0.8.2-cp310-cp310-win_amd64.whl (224.3 kB view details)

Uploaded CPython 3.10Windows x86-64

snkv-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (868.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (847.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl (275.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

snkv-0.8.2-cp310-cp310-macosx_10_9_x86_64.whl (285.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

snkv-0.8.2-cp39-cp39-win_amd64.whl (224.4 kB view details)

Uploaded CPython 3.9Windows x86-64

snkv-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (868.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (846.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl (275.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

snkv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl (285.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

snkv-0.8.2-cp38-cp38-win_amd64.whl (224.4 kB view details)

Uploaded CPython 3.8Windows x86-64

snkv-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (869.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

snkv-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (847.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

snkv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl (275.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

snkv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl (285.2 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file snkv-0.8.2.tar.gz.

File metadata

  • Download URL: snkv-0.8.2.tar.gz
  • Upload date:
  • Size: 106.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2.tar.gz
Algorithm Hash digest
SHA256 010fea5c57932a4c8488dee49bb317a9c0ea6fe34c7ecff90c143315f978fcca
MD5 87a440f3277f7480d8078cc90b20f6d9
BLAKE2b-256 7da8e9aa4b613291705d887432c97e9b9ff7d0fc08f24b9c547d4efe83fd7c5d

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2.tar.gz:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 224.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 dae15e9208659a94ea4c7061690d1f5372c9161499a0d0f3dc1c6351dd86eec7
MD5 ff28f527ec8bb24acafa6c10b7501b41
BLAKE2b-256 9d47ca67213837633658183101b4573ba9aaa81a1127cd65d041c02216e34204

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 efd97058079f2f3ffe59b7f3923d9ba2808355e537685f0ce234c22567e3acdc
MD5 0968a8e0d484744f6ea2073ce37cf534
BLAKE2b-256 db0c903d66c9273b30df894e10f1784643c5ed233b9163e0cd399f0d800d63c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7ced7b1537f3e044ec27bd610cc9c0d87a7bd3eeb591b73d47192caaf2d17096
MD5 ec8a0daf54e336f6f92fc00eea7ea9f7
BLAKE2b-256 ec589b28faea661b0c66a9ee3799c10893922dc94c22863865b3cf2f8b3e760b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.9 kB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4084f7a142f864fa54b862aeaff53f462287053799d71569f7fdc1883f6271e9
MD5 651bb790b5040332fca8b712b3f44299
BLAKE2b-256 6729763e5766706745300c04b1ff228d27d91dff8fc81248267daa3af2d1d73b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 eb6a0f7b1a675f4f9685bb4542ba6c1d3d2bb1679cb82236ded8af8bbe7da5b7
MD5 5c767bf7d6b9f249cc8b38939af5c61d
BLAKE2b-256 b0e0407f1dfc2fee58f0dd07052395cb80987247f1c944af36879f702686be74

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 224.4 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 93dc25673e67229219f5f6d233479e627b556efe01c2c94b7c6bf6a731119d6a
MD5 411ad8c8eaa9a14a31e7cd226cd3aa63
BLAKE2b-256 d015d0d525b5a679881fa1a2dbf906de362951a01df9366863e9adfc5c8d7324

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6cde0352316ae9d8da23bee0f57dfa0d5daf681570de48fc8e1a4b77174d3a2f
MD5 86f3e5eca67703099db921cbc7858f4f
BLAKE2b-256 dd30109f0b185dda9b7e5f9f3ca141e84732400f440f4c7678244563682d817b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b2fc964305d8744666e062d83df6fd29b62e4345ba1e9b25e2604b943c2e472a
MD5 15cb84bc0b21b81d5d33ec23310c576d
BLAKE2b-256 39091f6e1671c8927f8cf4d39b197452870308f9c36cd126576c2df4176d47f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 276.0 kB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 edd9ced00307b5f630374f9b0a2ba8d630fde2fa7cbf2796609722680f01af89
MD5 68604a69e780fcbb818ca2e31690300b
BLAKE2b-256 933575e40979a8f4021a7d74bd96bcba02bbaee38b64b365debbb228432f77b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 fd0312d145c767f844b8865aa0b1e6a5cd4d0eb7cb3d590400852116707cb978
MD5 d18b2449de79d7a06d190011bcfc00a4
BLAKE2b-256 cc7be34986fda7e022b4b2be13d36718beb720afbe58a97d04364633647c9b2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 224.3 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dddb6c44bf082621dc757728e1e0afe592c6bc2b179b92055eb604877ca35e12
MD5 4cf26d6f36621b0cffade89aa6ef6ab3
BLAKE2b-256 ef4c079e83e81a6202fd1b9a96535ec864c915dfe5bd0d54e2c854c9d046a380

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8f5c4e230f613df9e5e5aab4d92f43d4cd0f0731a1b87c3a1d6afd16e770e21f
MD5 69a4b0c6bd1ef69103e897f4f4614612
BLAKE2b-256 5457bfdfb2f8ade7719ac7e287de712d96d0790895d72b1eb80c360bd5de9861

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 142d8fe3d82601aabe23023304c4d2735d6518fd12db1d53fc1fadfa31a19dd3
MD5 c4430f793661598b21046109e2b49e1f
BLAKE2b-256 1871f4584a9f412dd8581c1262f8934639bbe2265cc35886039f84f129a61028

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.6 kB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a2f62451343382207323029357287e2ef7462d2229e5f1f1d9e732d524d0917
MD5 debd42067467e09b5732c055432432c7
BLAKE2b-256 311e21e3778710a02737fecb2d243196c30e59701d096af7fcc64c8e407c32df

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 50f277b62ac7c636af6520daa48e6518c0974a87f6af35cae2d518d34fb53091
MD5 39d7a61806add314e41cffaf0a7daba7
BLAKE2b-256 07df132ddc8ebcb1aa1ce25144dbf16b222932f7f8491f8aa83170a4f49219b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 224.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 4bff140d5e0de1534a2aed426528e85c1341c3645297d12451d767f5121f075c
MD5 69482fe43ec4afcfd650240eaf505a55
BLAKE2b-256 58eeeace7c9b3bdf296a1441ff334238c881a661b7e05f9127385dcaa857a9d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp310-cp310-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b212797594b76db05916155550ac6c7cf70ec804ae1d2943b9b6aec66e74739
MD5 5a01afc443a195a9f76da2cd73c8d987
BLAKE2b-256 5d7edd161a7cbe3899ee6582139fde5e053994f77c28d94d83b21ff64db34277

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2aeeb148a161fee1e2e62944bee5bfdee1ad35f081d55eca8a1cde17da9c0537
MD5 f1d53e3f34a226ed740a9bf85e0ca75e
BLAKE2b-256 a3566cdee6be1cfa9eb9d031c214be4fa7879ae5af0ed4c117a858028f25d594

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.6 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b58c644d027ce1c96add7e00e31b0118e2432e7f7b79bd103de36f8b2df11893
MD5 968786b7d9b8572b644ff9415e656553
BLAKE2b-256 8c84213df1152ab8c622ba1cf4d59452446ce7be3081f0ce7c83ad4306309364

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4026bd7439fd368ba4029e22994e58d2dcf0cfc3de830c23cd5fe5b050c2e490
MD5 2d8e01eb629a0236b29caea16bdefa55
BLAKE2b-256 876bdf5592b11358f31b10a51126d254ab50bdfab4d01bb089d8428652ecc101

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 224.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6f77436cc053fed806767909b9549535b7f95006915cb54f893ee38d409ccf16
MD5 e4135088d9252e3740288d7e55e2cc4c
BLAKE2b-256 9d673a3d6d749b978b74e00e390dd113b6b45d54c110989ee3a69b137f78f8e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp39-cp39-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cf3eb742f57d73a2c01b5ff45ef18e557fde29f33cfd7073ec80ed811dd2a5a3
MD5 e4dbf19376e7df4649bf440f130f0ff5
BLAKE2b-256 5bd39c2e272c29a5177b59d5e8c1cf5fe233e064f0a68647a0d1d950f2f3a82f

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0816e3f4d9cb169fc8123a79afcb7e2a1b9c7ffb711df9912536c6fbb310279b
MD5 bed459e45a638bc5dcf8bcd4c2a29a80
BLAKE2b-256 5286e5daf715adf1f09a6ec73a5cc051f32270ba4a68e30ae40185a4d7889afe

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.6 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5622ebab5eee0ff56f116766620a32e6ea416f3b23d53b51ac3b533e3389d7a8
MD5 176e01734ff80e1b0319c646f7323c2d
BLAKE2b-256 77e7fcf61b9ac9dbd57547e47ed0bc52216e9ee43c262f3fe53d6a1f2b2c3c5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 285.2 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 76099971c9a480c790aa523a08ddf3bbe9e975e4abb28f992d833b242f6a0208
MD5 e9520334b03923821661cd66b76ced7f
BLAKE2b-256 7c8eef9f0287b9dd72b07af3898eb015d5b47c244bc537823ebd1ffd3e368dda

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp39-cp39-macosx_10_9_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 224.4 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 5a11dc0b8376e5321e63ecaee7a1b2408f2b14286d008c698fc5532d924084ba
MD5 94d2c3990109cf3e2b67a5333e747810
BLAKE2b-256 a2799163297c591e4b37ce8e493866bfcaf2dbb9d30211e805d0574b6d24da84

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp38-cp38-win_amd64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 92e19fac59ac832904a5b7d11ada45e1d11380ab089b671e15efa514cc7cb27c
MD5 144ec1647fffac43ec6c155cc2e569f0
BLAKE2b-256 a59e17ca59cbb842103cef29cff9e6e72c0c819886bbf7866170aa7ecc895f51

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 da0af5f9935dcb95384b598f37b572cf507fcb9c3bfbc307872e246dd2933267
MD5 ce4c9dd1114c4e5a41042d4b049279c2
BLAKE2b-256 40c471088bd0df72d46c31d154f698ee529b93c5a22ac79aaf2f8ab2221518a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.6 kB
  • Tags: CPython 3.8, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 67be39b325e268cef05af55dcf8ac7a91a3e67ed751fd0e4dfaf6a2f89785522
MD5 0c41b16f0b34dbacdf523c3135a0eace
BLAKE2b-256 151514b62a13eee643b551909dc9346ffc25740a2c4ac08ee8ec5dc884d11895

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file snkv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: snkv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 285.2 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for snkv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4cd04df3d1c2040888912cf3a0247e8252444f5bfe19a572643413e6f32c0d1f
MD5 a0df8d0c276a6d9fc62470f7ae0d2ab2
BLAKE2b-256 3ab72fd42befa16d9b2087ac1f0c7cdb4397a1a60e5d6d07a0b800cddf19e939

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl:

Publisher: publish.yml on hash-anu/snkv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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