{"id":51027210,"url":"https://github.com/deepgram/humanhash","last_synced_at":"2026-06-21T20:30:49.483Z","repository":{"id":355502398,"uuid":"1228076660","full_name":"deepgram/humanhash","owner":"deepgram","description":"Deterministic, lossless, BIP39-encoded human-readable representations of digests.","archived":false,"fork":false,"pushed_at":"2026-05-03T23:19:40.000Z","size":55,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T00:34:01.803Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://github.com/deepgram/humanhash","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deepgram.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-03T15:06:43.000Z","updated_at":"2026-05-03T23:09:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/deepgram/humanhash","commit_stats":null,"previous_names":["deepgram/humanhash"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/deepgram/humanhash","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepgram%2Fhumanhash","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepgram%2Fhumanhash/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepgram%2Fhumanhash/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepgram%2Fhumanhash/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deepgram","download_url":"https://codeload.github.com/deepgram/humanhash/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepgram%2Fhumanhash/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34625624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-21T20:30:48.108Z","updated_at":"2026-06-21T20:30:49.467Z","avatar_url":"https://github.com/deepgram.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# humanhash\n\nDeterministic, memorable fingerprints of digests. Same hash always renders the same short word string. Built on the [BIP-0039 English wordlist](https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt) (2048 words, public domain).\n\n```text\n$ humanhash ac84a4a\nswim-interest-stable-neither\n\n$ humanhash 550e8400-e29b-41d4-a716-446655440000\ncapable-zebra-print-curve\n\n$ humanhash $(git rev-parse HEAD)\nobvious-dry-burst-debate\n```\n\n## Why\n\nLong hex digests are forgettable. Telling a coworker \"the regression is on `ac84a4a0b348cbdf89c92309d6ee8fd2bc59ced0`\" is harder than \"it's on `swim-interest-stable-neither`\". This crate maps any digest to a deterministic, short, memorable BIP39 word string — same input always renders the same output.\n\nThis is a **fingerprint, not an encoding**. The output is lossy — the original digest is not recoverable from the words. The point is something a human can remember and read aloud, not a reversible transform.\n\n## Library usage\n\n```rust\nuse humanhash::humanize;\n\nlet tag = humanize(\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\")?;\n// \"obvious-dry-burst-debate\"\n```\n\nCustom word count or separator:\n\n```rust\nuse humanhash::{humanize_with, HumanizeOptions};\n\nlet tag = humanize_with(\n    \"0123456789abcdef0123456789abcdef\",\n    HumanizeOptions { words: 3, separator: \" \" },\n)?;\n// \"ramp pole believe\"\n```\n\nA `humanize_bytes` / `humanize_bytes_with` pair is available for callers that already have parsed bytes.\n\n### Input handling\n\n`humanize` takes any `\u0026str` and treats it as hex. The following are stripped before parsing:\n\n- leading `0x` / `0X` prefix\n- leading `urn:uuid:` prefix\n- any `-` characters (so UUIDs work as-is)\n- any whitespace\n\nAn odd number of hex characters is padded with a trailing `0` nibble. Empty input or non-hex characters return `HumanhashError`.\n\n### Word count\n\nDefault is 4 words. Configurable via `HumanizeOptions::words` in the range `1..=5`. The upper bound is set by the 64-bit accumulator used for the fold (5 × 11 = 55 bits ≤ 64).\n\n| words | bits | unique fingerprints |\n|---|---|---|\n| 3 | 33 | ~8.6 billion |\n| 4 (default) | 44 | ~17.6 trillion |\n| 5 | 55 | ~36 quadrillion |\n\n## CLI\n\n```bash\n$ humanhash 550e8400-e29b-41d4-a716-446655440000\ncapable-zebra-print-curve\n\n$ humanhash --words 3 ac84a4a\ninterest-stable-neither\n\n$ humanhash --separator \" \" $(git rev-parse HEAD)\nobvious dry burst debate\n```\n\n## GitHub Action\n\nSame tool, also packaged as a composite action — useful for naming releases, tagging preview deployments, or making CI runs memorable in Slack:\n\n```yaml\n- uses: deepgram/humanhash/action@v0.2.0\n  id: hh\n  with:\n    hash: ${{ github.sha }}\n- run: echo \"Build = ${{ steps.hh.outputs.humanhash }}\"\n```\n\nEvery release publishes the SemVer tag (`v0.2.0`) **and** an annotated git tag whose name is the humanhash of the release commit, so you can also pin like:\n\n```yaml\nuses: deepgram/humanhash/action@correct-horse-battery-staple\n```\n\nSee [`action/README.md`](./action/README.md) for inputs, outputs, and examples.\n\n## How it works\n\n1. Input is normalized (strip `0x`/`urn:uuid:` prefix, drop dashes and whitespace) and parsed as hex bytes.\n2. The bytes are folded through a 64-bit FNV-1a hash into a `u64` accumulator.\n3. The accumulator is masked to `N × 11` bits, where `N` is the configured word count (default 4).\n4. Each 11-bit window indexes the BIP39 wordlist (2048 entries = 2¹¹).\n5. The words are joined with the configured separator (default `-`).\n\nFNV-1a is used as a uniform mixer so single-bit input changes avalanche into completely different fingerprints, and short inputs don't degenerate into mostly-constant output.\n\n## License\n\n[Unlicense](./LICENSE) — public domain. The BIP-0039 wordlist embedded in `dicts/bip39.txt` is itself public domain (CC0). See [NOTICE](./NOTICE) for upstream credit.\n\n## Inspired by\n\n- [zacharyvoase/humanhash](https://github.com/zacharyvoase/humanhash) — the original 256-word humanhash. This crate diverges on wordlist (BIP39 / 2048 words instead of 256) but the spirit of \"hashes that read like English\" is the same.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepgram%2Fhumanhash","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeepgram%2Fhumanhash","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepgram%2Fhumanhash/lists"}