Skip to main content

stablehash

The stablehash module provides a "pure" hash function that is stable across Python processes and runs. This is in contrast to the builtin hash() function, which may return a different value for the same input in separate invokations even with the Python version.

We support most Python built-in types, including mutable types such as list and dict, as well as dataclasses. The default internal hash algorithm is Blake2b, but this can be changed by passing a different hashlib algorithm to the stablehash function.

Usage

from stablehash import stablehash

assert stablehash({"key": "value"}, algorithm="md5").hexdigest() == "0ea2506ffbeef2699760d422d7a8b971"

Compatibility notes

Since 0.3.x

Hashing semantics are changed for certain inputs to improve stability:

  • Dictionaries now hash independent of key insertion order (i.e., equal dicts produce the same digest regardless of the order keys were added).
  • Serialize floats as IEEE-754 64-bit little-endian (struct.pack('<d', x)) to guarantee cross-platform stable digests.

These changes may cause the digest produced for the same value to differ from the 0.2.x series. The public API is unchanged, but we treat changes that alter produced hashes as breaking from a user's perspective. (See PR #20 for background.)

What should downstream users do?
  • If your project depends on exact hash outputs (for example, using them as file identifiers or data fingerprints), either:

    • pin an upper bound to the previous minor series: stablehash >=0.2.0, <0.3.0, or
    • upgrade to 0.3.x and re-generate your stored hashes.

Versioning policy

This project follows Semantic Versioning where applicable. During initial development (0.y.z), the public API should not be considered stable and breaking changes may occur in a minor bump. We therefore use the minor version to signal changes that can alter produced digests (semantic changes). Downstream users are encouraged to specify an upper bound on the minor version when depending on 0.y.z releases.

API

stablehash(obj=..., *, algorithm="blake2b")

Returns a hashlib-compatible object with the given algorithm and the hash of the given object. The algorithm must be one of the algorithms supported by hashlib.

stablehash.update(obj)

Updates the hash with the given object. If the object is not supported, a TypeError is raised.

stablehash.digest()

Returns the digest of the hash as a bytes object.

stablehash.hexdigest()

Returns the digest of the hash as a string object.

Supported types

The following types are supported:

  • None
  • bool
  • int
  • float
  • str
  • bytes
  • tuple
  • list
  • set
  • frozenset
  • dict
  • @dataclass objects
  • datetime objects (datetime, date, time and timedelta)
  • uuid.UUID
  • Picklable objects (e.g. those that implement __getstate__())
  • type objects (by their full qualified name)

Metadata

Release files for stablehash 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for stablehash 0.3.0
File Size Uploaded
stablehash-0.3.0.tar.gz 8.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for stablehash 0.3.0
File Interpreter ABI Platform
stablehash-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.5 kB

Release files / stablehash-0.3.0.tar.gz

Download URL stablehash-0.3.0.tar.gz
Size 8.2 kB
Tags Source
SHA-256 checksum
How to use checksums
31d89697683c664487b6f995759aa14bc65bb9de31ad8beca5e99c8678b66baf
BLAKE2b-256 checksum
How to use checksums
5f01159196c21db96a7adde6d52e7691762ef873a708c6d56ea4e8bd99ba8392
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2025.

Transparency log

Release files / stablehash-0.3.0-py3-none-any.whl

Download URL stablehash-0.3.0-py3-none-any.whl
Size 7.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
82b59223e7c5c9b6df42dd4d3f1dbdc1356ecf80102405f5355dc287b28b77f6
BLAKE2b-256 checksum
How to use checksums
7b7a4eb9fc77dececb5478f1d105b6b6c5a64706aa0715134b0bf50a1081406f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 27, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page