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.1.tar.gz (105.9 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.1-cp313-cp313-win_amd64.whl (216.2 kB view details)

Uploaded CPython 3.13Windows x86-64

snkv-0.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (849.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp313-cp313-macosx_11_0_arm64.whl (276.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

snkv-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl (286.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

snkv-0.8.1-cp312-cp312-win_amd64.whl (216.2 kB view details)

Uploaded CPython 3.12Windows x86-64

snkv-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (849.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp312-cp312-macosx_11_0_arm64.whl (276.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

snkv-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl (286.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

snkv-0.8.1-cp311-cp311-win_amd64.whl (216.1 kB view details)

Uploaded CPython 3.11Windows x86-64

snkv-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (849.2 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp311-cp311-macosx_11_0_arm64.whl (276.0 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

snkv-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl (285.4 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

snkv-0.8.1-cp310-cp310-win_amd64.whl (216.1 kB view details)

Uploaded CPython 3.10Windows x86-64

snkv-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp310-cp310-macosx_11_0_arm64.whl (276.0 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

snkv-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl (285.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

snkv-0.8.1-cp39-cp39-win_amd64.whl (216.2 kB view details)

Uploaded CPython 3.9Windows x86-64

snkv-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (869.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (847.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp39-cp39-macosx_11_0_arm64.whl (276.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

snkv-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl (285.4 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

snkv-0.8.1-cp38-cp38-win_amd64.whl (216.2 kB view details)

Uploaded CPython 3.8Windows x86-64

snkv-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

snkv-0.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

snkv-0.8.1-cp38-cp38-macosx_11_0_arm64.whl (276.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

snkv-0.8.1-cp38-cp38-macosx_10_9_x86_64.whl (285.4 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: snkv-0.8.1.tar.gz
  • Upload date:
  • Size: 105.9 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.1.tar.gz
Algorithm Hash digest
SHA256 f9d38ce93b56df7dba8e53dae2a74e68112e0455aeb8bc5b7928d0df3c583bb8
MD5 29a3c382d6a02811f23ef5d04454478f
BLAKE2b-256 a6e3bb2b0872087b8aef62b2afe6ca5abf38f848bed5be75ad99eb75b26f7c16

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1.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.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 216.2 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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 526acc00c726fa276117f529214e6c94bc8119e0b4d4f81f2f8de0a082dd97bd
MD5 5dcd28cc5e09d41f5a6a433b18b75d3b
BLAKE2b-256 d84195445fd8f9e7360439f103f3d457446160183eb6aa899ffe703bdaf571d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0e5ff78f0efe57d3f743cad7758566958f3fbe6e0b78d9a556882d48b7203a7e
MD5 405ac186a636e128d7ebf47408ac105f
BLAKE2b-256 8356bde09d4ae5477119ee731a40beebb8ef4bf93e839efedfb0531a5884fc1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6402cfdd4bb784343e321512909be7e7a0ea97b0f35285dce304a3d501ca75cf
MD5 af84e59ad3cd67bb26444ca981af16d7
BLAKE2b-256 0cb2c7dbdc238af4752aa650f17f0048135f0204c4cdb9d886e3ddee374a5feb

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 265666d90708b5233be92b24f6cfe384c73911167c047684c6f506f065166ff9
MD5 c84b5b7b7431c06c81aed17e2eb17cc1
BLAKE2b-256 9ca900849812f9834188206e7813b3c4da487fab1fb28854017b38d8151224b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 574b56d07804880eb27a521603fa756bb8f23a442055b885852553cd2a84ffd7
MD5 af86cefb77ce02471645686764831422
BLAKE2b-256 178015c5a497ccdc868b6a66b50740396a0f675b9af6221e7cd3883cbd71b7f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 216.2 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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 db678a6d8431899b5f3580eef439f0f887a03e891e55ce1d57d0cb3f3a98e461
MD5 b57780ae1992eeb3eb7809b9f67848ff
BLAKE2b-256 1f0168c3fa74d16f680bb2a0b7e1866d36fa03babcb8adbb9a3deafb7d9e4f78

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 81172cc53ff7d7c82f15d7a73d08ea026dbf8604409dcec3a084fcdb27184586
MD5 2e53f952341413ff62e53933d0d2f987
BLAKE2b-256 e2aa32ff32557cb79c365a78729bbc2f99f92f7453e1d889e291031e89e6ea3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8b4657aaf1ade7f721e1e8b139b40beaa8d7ba43dbf96f4e919b1b1fa45b79a0
MD5 90823a1ad06d9b921dd134a94254cb98
BLAKE2b-256 0d11246b28679038d5eb3ee785b1274d7c2ba3be26bde6c7aff404b2b4835cd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 549835f24d350d068bb192fdc4211fcea48b2de94da3245915e496405cbe21d6
MD5 b6fc1d10e88dd922ef074afd96ba6877
BLAKE2b-256 de9f06de6e9d19e7ad124bf241a808c19275f1f8ca8dbf4e84edf707c912baab

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 304c178f754e2ed1d2cc0a76eb933ef7b472dcca3e40da44116de78259fc1feb
MD5 bdd9b1f8b31f98750d180c0087414c41
BLAKE2b-256 3fcb22fa0c61f485dac70d80ac64ad56625ab70485d25dba3d78c7d329be6c65

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 216.1 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.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 298b485216a342dcc15c2728a15601fc528334a51b5a402af361cbfefd96aa25
MD5 f22c8ce2b0ed8bb745461bbc5f53ece7
BLAKE2b-256 d78db5a7d97056c7ca6063a4d5265d2880532f3b1e3ffd9a81da344778c4985a

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0134136c81bea1c3fbb98b56fa0cbb65aa92c306ce84c885a1d8aaab0b1cd631
MD5 d6eb93c8138d8c38618daae4d2703acb
BLAKE2b-256 283b7ebde5c375f9d56789e740d496626f97abc2b3880b87480a40bcd7bd9e97

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e87eca19e54a22a4801b2dd09a3e54bc1f7dcad593a46e42ed972d170803a0a0
MD5 c0b51e56d9e3abd50b8688c3d7b95a3a
BLAKE2b-256 6b231b9e68882c7537bb81b3d6c308c2bfd3e443b9a8867de04d19ceab6c320f

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2c1f042cac4460e65a90d4929f4680ebe18b7d250503d8a7ceb27c64296b21af
MD5 40a04b662533d59a952a5a45739e271a
BLAKE2b-256 6c036e44b661c8361f4fdf95d8e52f08b1b248e363327af5ddeb2b36aeebbf23

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ff790c3c3038a34b422fc4c3bc24a75629bae00de6a4935a8b3f59a83640eb82
MD5 00910e0cf85e11d89bece952d78f8f13
BLAKE2b-256 e267755a4e04c350058ea57bfd8987abb7f9bde456e02039f134d75d70d7f539

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 216.1 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.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 69ebfeb6479c74eeac7f44936f8800ad5f2b3a168200618c2e4fbc2a150342fb
MD5 9aef7f2f8395cf246284f0fd9a4c7c4d
BLAKE2b-256 fe67f3338062eabe54f2557d48290fa6ecbb6f18a14e03cbccd50d9dd634d765

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2eb79784377140cfcd1c011e2134c96f585f47ad91b002e0c4acb7a37210bf75
MD5 f54da37afaa7925bd1089b7271d73519
BLAKE2b-256 5f56d4ee8a2d72867368a8a7a47ca4b4593f4136ae787bb7b6be020b928b3972

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2a8414ee1b0575ae57c14b1ed60cce98fb67ca2596ce030e8657a72fe8c6d225
MD5 b2859688c6937636954124563eeccc6c
BLAKE2b-256 f378d86cddf25fa053d8d1a076758912bb301532d223cf3277b4f0e78bb550b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d266fbba4e53299b2443675ba3a006f2a0af21da8f6615313e19dc4313a885b1
MD5 971988f89ed462a13238418f46ca5e04
BLAKE2b-256 12eaf5fb9f903e9644df34b31f9570f66c027e0d4cf595f685c75b50f96e70ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2243e65a5eb945e486f86f83d345aca0bfc99e8e3f07be2f5102f13fd70c3662
MD5 3f83e8a137d15c60a27d910ae9b61c0a
BLAKE2b-256 d7c3f28e17f43e0139734d14b976fb9b42af199995cb561282eb8939e776d70c

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 216.2 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.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9dd40771d0880748ceeebac47f0f8b49911ce055bd4f41c749755a14489b49b0
MD5 b06cf5026230e8ad4b956e555bfa8e0f
BLAKE2b-256 9dec4e8717140fb1157a38b0af066522de5338b6fa16a47e430e6cedd2bd61a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d1de90c6c73d40751e3111f474773cf81840dd50a4d72f39d97ef542e4e8d449
MD5 8c0263931c6c89367a8f3acb03362497
BLAKE2b-256 950b6302a8daf334f2ccf88b9da1f328d1b3494dbdc31d9a59544f5d855380d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bf8699665ab1679bd2ebd67cdba9ed5cd36fc973e76a673208936c6da420695e
MD5 da52600f42c77097ddc11405c0c3d497
BLAKE2b-256 4d4a82c2ef23cfde15753c398184cc803f1c2947bee36ae780172b9e905ec1c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 276.0 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.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b50a62e754d53b4e400c1164ac40601feb440b24ce904cce8674ab0657359a2c
MD5 cc6080d9083af22c5addb489307fa7c4
BLAKE2b-256 60545800a38ad63e56cf0d79aadd8fee9f7dd9e988677b96dc8ac7f547e61f9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 285.4 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.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 591a2b85d0d50c81c2ed934e0fdf511209a5f64bf9d5b35349a23696180569a3
MD5 8482d42f730747f6ed169553e41ae149
BLAKE2b-256 a9a00e2b52a4589227b002a8a62ccb47fc7bd62e10df639e260ff513b1fdd504

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 216.2 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.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 00e2ee13037d3f7436e3d57ca0eb93c138877e888f6b82b17845cb2013528c70
MD5 73d78d49de9f0f97752e79a918359217
BLAKE2b-256 49b0ff091f125a118c5194cd84aca4ad5d08ae81fa0275d4fd88ac38b52253cc

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3824e57cc18c40a0cf03d1bc8df66f48ca2bdc953761209943a6c6508887bf6b
MD5 debc66d6ea95e0a1eb97332acd9a3f62
BLAKE2b-256 a6699b200282f7d7b520df87eda1fd021116f3d13e7ad1dfaf1e3d93539a0540

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for snkv-0.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 80c4991c048ea28473fbc5cf94f5da6da921bc5d2cb2862595a5cf17a6270e41
MD5 9556754ab8cdeecb40ec34c95254a7a3
BLAKE2b-256 2f4a039174ee7971b7c399359a67e0873e884db4ee692e74fcf4c8befa38ad44

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 276.0 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.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 07d6b9fa4c621a6457103a0ba7013450d7a968ef30de32bfc300f0861d5e5e6b
MD5 884a6597912b15d3e63f10d68091b809
BLAKE2b-256 1e87e2adb4f5a24188bcf7baa7f48332b78a66aa04e7edeb5aeb56ac02672b75

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: snkv-0.8.1-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 285.4 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.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 afcdd50baad0a2bb7a4ab40a6967ee0c4b8c3feeade08ad80a31e03b5e9791e2
MD5 fc68701aa55685edd24d31c3e93843fe
BLAKE2b-256 c14eeb53f9f4e0310e6d315da8b16b52f72f9c2f3b24e11a0eb4c025c4c1b06d

See more details on using hashes here.

Provenance

The following attestation bundles were made for snkv-0.8.1-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