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.0.tar.gz (104.1 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.0-cp313-cp313-win_amd64.whl (215.5 kB view details)

Uploaded CPython 3.13Windows x86-64

snkv-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (849.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

snkv-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl (285.7 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

snkv-0.8.0-cp312-cp312-win_amd64.whl (215.5 kB view details)

Uploaded CPython 3.12Windows x86-64

snkv-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (871.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (849.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

snkv-0.8.0-cp312-cp312-macosx_11_0_arm64.whl (275.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

snkv-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl (285.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

snkv-0.8.0-cp311-cp311-win_amd64.whl (215.5 kB view details)

Uploaded CPython 3.11Windows x86-64

snkv-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (870.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (848.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

snkv-0.8.0-cp311-cp311-macosx_11_0_arm64.whl (275.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

snkv-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl (284.7 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

snkv-0.8.0-cp310-cp310-win_amd64.whl (215.5 kB view details)

Uploaded CPython 3.10Windows x86-64

snkv-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (869.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (847.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

snkv-0.8.0-cp310-cp310-macosx_11_0_arm64.whl (275.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

snkv-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl (284.7 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

snkv-0.8.0-cp39-cp39-win_amd64.whl (215.6 kB view details)

Uploaded CPython 3.9Windows x86-64

snkv-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (869.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (846.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

snkv-0.8.0-cp39-cp39-macosx_11_0_arm64.whl (275.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

snkv-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl (284.7 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

snkv-0.8.0-cp38-cp38-win_amd64.whl (215.6 kB view details)

Uploaded CPython 3.8Windows x86-64

snkv-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (869.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

snkv-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (847.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

snkv-0.8.0-cp38-cp38-macosx_11_0_arm64.whl (275.4 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

snkv-0.8.0-cp38-cp38-macosx_10_9_x86_64.whl (284.7 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: snkv-0.8.0.tar.gz
  • Upload date:
  • Size: 104.1 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.0.tar.gz
Algorithm Hash digest
SHA256 85310a7f8eb00a7fda0de5a3ac6f20360b85d0efca6f964a4021924a1f7ba788
MD5 cc3d0e0f1a710b94e4182e8f12a566a8
BLAKE2b-256 b2cccc5266a26992f974b3252d8f7618f110e17c94ed47f1a2fe36bfb1955a18

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 215.5 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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1fcc8d8b5dd25e2289cab718915845de1fec77e33fbff0dcd5c11214e84cbf92
MD5 689341b57ff06dab24d4717456c3d1f6
BLAKE2b-256 9d1c31d4beed5eb724b32c6e6f67cc13a04dfcd8e8ccb7b1aab8083647d6e098

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e914ee88c790d80d631414852c6ac62286eec18dfdedb76094aff8853c982dd
MD5 45cc5c4a7be8e6770240d14ed44d392e
BLAKE2b-256 c46dbef86a215091360a557fc3fb2f86a7a5f1017c8f35cad61cf636acc4e722

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a620dce95fabe148018f9e9b7e03324c0d0aaff12962e5a0bbe1851b7e800b78
MD5 5957ee2357eb2219844dc80e702153fc
BLAKE2b-256 78c19d19478f209f3dd69d4f857d8722cd139b4c98db8da83b386f2498622d62

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a701d08a22ef96ee4886aef6585300951405e1a54eddc88b1782aa71cdcd5b7
MD5 62ec8dfb23624e1318a3713aa94a062f
BLAKE2b-256 fe411d3028dc31e295edd62ae89eadd31d8ff2abad52c1d94b6bb5ff5832e00b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e419efbd75d77130b5530b24aed730cbd2ce4d60b0d2aa20a57b69c904a9b8eb
MD5 76e7da6a4c06793958d0098ab9890e97
BLAKE2b-256 28e87d457fa2fec4bb8ce7e8115aa0a7e66aa0545e7b8a64099741d4fcec3adc

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 215.5 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 96bdb37a4dcfb8c77869f7b45e3312371793124c99a9e917e6bb4c9d23b45a60
MD5 805f1399bfe40c2ffa2524a9000fc598
BLAKE2b-256 217bd0524d8ae120e8e14d949a0d682efaf3598f7801f2acf368de49c88e22c1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b91e918aefeaaf12d77f627d9b1de5857dcdf085921716f087ecfb0295df1601
MD5 9e4d61a69be3fc9edaeb17a9b19f0f69
BLAKE2b-256 c3406e1f207b92d799a66ce5890a89d583aa1c70e056de8c56b1776daf2a7999

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 60421a0f80dd13f8a4f74425d17b0f2166c6d4703743b3334314cc5b673c6de7
MD5 a2c4eb5b6e86ebbd4cb8985636fd0b37
BLAKE2b-256 8fccd823d2944a0d9262b54d533edb7c58acc6e03db1dddaeec85d64c968c8cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dec2e301c9e7b950bb9f210201e824f3a74c90ddaa03fb52ca48589ee10a94d1
MD5 bfe52df3ba0f2e9f118f07d6dec82675
BLAKE2b-256 065a7aa35e1742c1f8e2f50e33f9639160c7b378905ddbfa551a1b327a1da350

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d6770db104b26f7aa3af19c181ea4140336d39949f14f60a69fbdd19a236f2ef
MD5 3467a2de0d99f643b4a9e2e09e4f29ac
BLAKE2b-256 9d719d202b29af649a210499f4005055ad991f9cfa52d87cd09af59c5e9e1c5c

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 215.5 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 42fa4fef5f7579f3a394a42fe97e2a2ee9850e3a9e3909fbdaede7008dc9c84c
MD5 9578c27e0aae0ecd9ca8cbb3f55bdee0
BLAKE2b-256 fbe4c63289e4938891dcaf45b2ae7596bbf7d9ac37f985f7804abed57795463f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4f82259a0f09eb420d09c2f5589bafe16a7a606243f129f7d65800c1ee774e71
MD5 af617daa2160ba9bdf5183912a49ba8b
BLAKE2b-256 e921e063616f17eecadbe4ce95ac6a21e9248bbdbf8e209820d25b5d2e876d3a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ea0e65861f65da82af9318264b3fa61b1632762a1a62b289d2f291eff3012499
MD5 87a10091629afcdc07b3eff772a3f062
BLAKE2b-256 ad15b40e7eaa58f118d9cd194ece52ee21e93cb2f40e75cd5f575801a48287b1

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1dd6218e3485dc16ebebbc2176334efb77d2425227ceaec28f34544c30192b30
MD5 458817736d27c07cc7de905106074e97
BLAKE2b-256 0a1aa7a296063c968087db6b1925a5892ced3a6f7ac4862b0141eba34da03bb9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 9574e10300a568cfb231cb144e2cfff51b93724340bda31ea18e628ad44929a2
MD5 2008716972d9fb15c1155b21303731ce
BLAKE2b-256 31614a15df29232619462cb33668b3732a7072b2d568b9def1f2820a11d70398

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 215.5 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6ee2829ca4a3dbdffcb86826447fd4bc1ec58238c376bed87d1daea8f38531c4
MD5 0128034dbcaac5522f35c3a4a207fd75
BLAKE2b-256 54f08bb8657fccadace14e90d23a45f55d58ef442b88b8dbd20763f12469232e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 339750261a7c7ade571cb53d80c5f0d899a16b4d9b4ad6057699ed983880f5bd
MD5 ab8a5cb3f323c4d243563a8c76461165
BLAKE2b-256 b0b7ab84169b49dda09f0ce60faa6a051c1c9d7c3d3907a07b94ef9959d77389

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 73790be302061ca4f30c687c8e3f97b0ace46a8f13462bdc9e77f8cf1aa5a3c3
MD5 850e9858e3a68018be1dcce697176144
BLAKE2b-256 08ac341c13e735d0314877f1f4f76b6eb5d30d29a46b444bfa8e055881215e63

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1bbd1627781fe05b98dfc93d15f832f7b59efd28c2af9aeccbb2939383bfb489
MD5 a8a4b7c8ea67e818cb415bae89405f23
BLAKE2b-256 0779fc8ad79fe8fede38da58fa86bf325acc37d39797f287e436e709aff7f9e5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7586f1e8359d30c7f25285f4da547adf88bb533e3f87a0fed8a46074cad73b53
MD5 2b80509986c19c47506142c0ca235504
BLAKE2b-256 bf14304c374559339eb854a37d83ce5ad25e8cea648fa554657b8a282d49cf5d

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 215.6 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.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 23c05324a43acc4692bb3ce7a0d6f4d9e9a416b836a1ab355c092f98832713d8
MD5 c90cffad8b21a04798c2a48a758e3974
BLAKE2b-256 2da7be4cf18402c827206fd56723b697042298b22b96c37cbd313de25c94a755

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0b4915c21d604dc82c915f715fabff11c4936e234fc57546d4a65501f22d886c
MD5 0b25f309baaac8869e9df6e5fb6d9665
BLAKE2b-256 ec266a676ed97d5dc98fa26be1ccbfd1b4b6c51eabe0eb792991a0b6120e861d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 67f0d03f5df0663165e3c1100c7625e9fb4ee82ef48b8c0d9ccc1af772191324
MD5 02486cf8cc9737e656fa8e8e6de23595
BLAKE2b-256 e05c0428ff1c51c5213dc058a3db0b3892a00c8d97c9abf7c69ed8236acbc9b2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.3 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.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 680dde29db8c8387ac6f4c5330599d5c3564e1de8c120d328589f36295e7c229
MD5 dc83604fd78dc01a79ab93c4cdd8f8ac
BLAKE2b-256 e508c60e23e0553dfe965cf52a377ba5402344a67ade37d200f2fdd18a3c1a95

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 284.7 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.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2fceebf4d63f0cb68ac42d75b7b909b92e2d4bf3434f58c56fd8ddcabf0f836d
MD5 a4c2130a200c8ec920cb5a271acbb76e
BLAKE2b-256 d620e49659ee3ed0a7129cbff396c6cc22ed3d035c6454eb27148292f0ac07a2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 215.6 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.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 c13086901f5dfd5a4866a57fb833d19299476b3181c71915c9ee277b02a461a6
MD5 8608a69edfeaad5a578ae3ba03079d6b
BLAKE2b-256 28ded0f04331f186c38b897aeeede97cf05486c2a2a8b94962dcc0cf5726a774

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a33487d42080dbd4c9e2fe2663b17e1a118e85597307dd23615098d508a48473
MD5 5d887115641370e0632263f19232898a
BLAKE2b-256 de66543b50bef764b195cef949c4f7271e50d453c41f6dc9fb02b13d4c159b17

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for snkv-0.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 655c9093c13f726bbc19ac74944251c229aecf264bf018da01e2e9afe1fa2a91
MD5 3a534702d99dd845669539063d53e66a
BLAKE2b-256 91a2971aebd86ea0fd16b5d9dab128843801a5be18bb7ec6a94c977ef9ad09e8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp38-cp38-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 275.4 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.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d05f125dcd8f564f32847d6d49dad113dec30bf990116aee0e650d2e89a6535
MD5 5c5c32662a38c805a29a2629be4882e0
BLAKE2b-256 61e2eaf2b89e43bfa0d7c99024e74657b09ff54de08ad5664f48371eb4c87669

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: snkv-0.8.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 284.7 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.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f9737d4d31e3a7322805661184a59959fb894b4efb6e5719acbab71bbcf48db3
MD5 9c63af031f6424c1d3ab7873092cb45d
BLAKE2b-256 70f2ec8b78188d50b423043fdbb750c5956aee28da3715772665ea616dcc6964

See more details on using hashes here.

Provenance

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