# 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
```python
from stablehash import stablehash
assert stablehash({"key": "value"}, algorithm="md5").hexdigest() == 'd5994850379366e314563ea555532052'
```
## 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)
Raw data
{
"_id": null,
"home_page": null,
"name": "stablehash",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "dataclasses, hash, hashlib, python hashing, stable hash",
"author": null,
"author_email": "Niklas Rosenstein <rosensteinniklas@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/81/bb/34c025c11dbc2e6f92ccdbc6a76223b5ebd6a79da80aa22f80b6e75e1a76/stablehash-0.2.3.tar.gz",
"platform": null,
"description": "# stablehash\n\nThe `stablehash` module provides a \"pure\" hash function that is stable across Python processes and runs. This is in\ncontrast to the builtin `hash()` function, which may return a different value for the same input in separate\ninvokations even with the Python version.\n\nWe support most Python built-in types, including mutable types such as `list` and `dict`, as well as dataclasses. The\ndefault internal hash algorithm is Blake2b, but this can be changed by passing a different `hashlib` algorithm to the\n`stablehash` function.\n\n## Usage\n\n```python\nfrom stablehash import stablehash\n\nassert stablehash({\"key\": \"value\"}, algorithm=\"md5\").hexdigest() == 'd5994850379366e314563ea555532052'\n```\n\n## API\n\n### `stablehash(obj=..., *, algorithm=\"blake2b\")`\n\nReturns a `hashlib`-compatible object with the given algorithm and the hash of the given object. The algorithm must be\none of the algorithms supported by `hashlib`.\n\n### `stablehash.update(obj)`\n\nUpdates the hash with the given object. If the object is not supported, a `TypeError` is raised.\n\n### `stablehash.digest()`\n\nReturns the digest of the hash as a bytes object.\n\n### `stablehash.hexdigest()`\n\nReturns the digest of the hash as a string object.\n\n## Supported types\n\nThe following types are supported:\n\n- `None`\n- `bool`\n- `int`\n- `float`\n- `str`\n- `bytes`\n- `tuple`\n- `list`\n- `set`\n- `frozenset`\n- `dict`\n- `@dataclass` objects\n- `datetime` objects (`datetime`, `date`, `time` and `timedelta`)\n- `uuid.UUID`\n- Picklable objects (e.g. those that implement `__getstate__()`)\n- `type` objects (by their full qualified name)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Stable hashing of Python data structures across separate processes and platforms.",
"version": "0.2.3",
"project_urls": {
"Issues": "https://github.com/NiklasRosenstein/python-stablehash/issues",
"Repository": "https://github.com/NiklasRosenstein/python-stablehash"
},
"split_keywords": [
"dataclasses",
" hash",
" hashlib",
" python hashing",
" stable hash"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7acd4c6f2110c3e58b765849427e99ed5c302a81c09f5bef28d2cb6600d3355e",
"md5": "a7968a787e6c709d221729ec50aa2f14",
"sha256": "a9e177522ccb40ca37a13ac0f4fcaad15fd9e0db0b32e5a947f934c65f326d5d"
},
"downloads": -1,
"filename": "stablehash-0.2.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a7968a787e6c709d221729ec50aa2f14",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 6098,
"upload_time": "2025-07-15T11:48:17",
"upload_time_iso_8601": "2025-07-15T11:48:17.804206Z",
"url": "https://files.pythonhosted.org/packages/7a/cd/4c6f2110c3e58b765849427e99ed5c302a81c09f5bef28d2cb6600d3355e/stablehash-0.2.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "81bb34c025c11dbc2e6f92ccdbc6a76223b5ebd6a79da80aa22f80b6e75e1a76",
"md5": "d9b4d230f332e7f57aeb0ec80dbd6a5d",
"sha256": "5e84d7058ba965c5975096c2225c0ba8f282b4ae9779f3d3dba334df06a509cf"
},
"downloads": -1,
"filename": "stablehash-0.2.3.tar.gz",
"has_sig": false,
"md5_digest": "d9b4d230f332e7f57aeb0ec80dbd6a5d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 15503,
"upload_time": "2025-07-15T11:48:19",
"upload_time_iso_8601": "2025-07-15T11:48:19.135052Z",
"url": "https://files.pythonhosted.org/packages/81/bb/34c025c11dbc2e6f92ccdbc6a76223b5ebd6a79da80aa22f80b6e75e1a76/stablehash-0.2.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-15 11:48:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "NiklasRosenstein",
"github_project": "python-stablehash",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "stablehash"
}