humanhash.dev
Memorable names for hex digests.
Turn f3527e4ef32f… into canyon-jam-telescope-creek. A tiny, free REST API for SHA-1, SHA-256, MD5, UUIDs, and anything else you can encode as hex.
Try it
GET any hex digest at /api/v1/hash/<hex>. The endpoint is open, deterministic, and CORS-enabled:
https://humanhash.dev/api/v1/hash/f3527e4ef32f9d8b59ead6b7b70a843c3da1c105Response:
{
"inputHash": "f3527e4ef32f9d8b59ead6b7b70a843c3da1c105",
"hash": "canyon-jam-telescope-creek"
} How it works
HumanHash maps any hexadecimal string to a short, pronounceable name in three steps:
- Parse the hex input into a byte array.
- Compress those bytes into N equal segments (N = 4 by default) and XOR the bytes inside each segment down to a single byte.
- Map each resulting byte (0–255) to one entry in a curated 256-word list, then join with hyphens.
The output is fully deterministic — the same input always yields the same name — and the algorithm is stateless, with no database or randomness involved. Four words from a 256-word list give 256⁴ ≈ 4.3 billion combinations, which is roughly a 32-bit fingerprint: comfortable for human recognition of individual deploys or builds, but not a substitute for the underlying hash when collision-resistance matters.
API reference
GET https://humanhash.dev/api/v1/hash/{hex}
- Path parameter
-
hex— any hexadecimal string. There is no length restriction; longer inputs are XOR-compressed before mapping. - Response
- JSON:
{ "inputHash": string, "hash": string } - Words
- Always 4 words, hyphen-separated, from a fixed 256-word list.
- Auth
- None. CORS is open.
- Rate limits
- Best-effort, no hard limits. Vendor or self-host for heavy use.
Code examples
curl
curl https://humanhash.dev/api/v1/hash/f3527e4ef32f9d8b59ead6b7b70a843c3da1c105 JavaScript (fetch)
const hex = "f3527e4ef32f9d8b59ead6b7b70a843c3da1c105";
const res = await fetch(`https://humanhash.dev/api/v1/hash/${hex}`);
const { hash } = await res.json();
console.log(hash); // "canyon-jam-telescope-creek" Python
import requests
hex_digest = "f3527e4ef32f9d8b59ead6b7b70a843c3da1c105"
r = requests.get(f"https://humanhash.dev/api/v1/hash/{hex_digest}")
print(r.json()["hash"]) # "canyon-jam-telescope-creek" Go
resp, _ := http.Get("https://humanhash.dev/api/v1/hash/f3527e4ef32f9d8b59ead6b7b70a843c3da1c105")
defer resp.Body.Close()
var out struct{ InputHash, Hash string }
json.NewDecoder(resp.Body).Decode(&out)
fmt.Println(out.Hash) // "canyon-jam-telescope-creek" UUID
UUIDs work too — strip the hyphens first:
curl https://humanhash.dev/api/v1/hash/550e8400e29b41d4a716446655440000
# => {"inputHash":"550e8400e29b41d4a716446655440000","hash":"vault-lift-onion-lilac"} Example: GitHub Actions
A common pattern is to derive a memorable name from github.sha and use it alongside the SHA — for example, to tag a Docker image with both. This is exactly how we use HumanHash in our own production pipelines:
name: build
on:
push:
branches: ["main"]
env:
IMAGE_NAME: "ghcr.io/your-org/your-app"
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get human hash
run: echo "HUMAN_HASH=$(curl -s "https://humanhash.dev/api/v1/hash/${{ github.sha }}" | jq -r '.hash')" >> "$GITHUB_ENV"
- name: Build Docker image
run: docker build . --tag ${{ env.IMAGE_NAME }}:${{ github.sha }} --tag ${{ env.IMAGE_NAME }}:${{ env.HUMAN_HASH }}
- name: Log in to registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
- name: Push image
run: docker push --all-tags ${{ env.IMAGE_NAME }} Every push gets two tags: the exact SHA for reproducibility, and a human-friendly name like swift-river-mellow-bolt that's actually usable in chat, dashboards, and standups. The jq binary is preinstalled on the GitHub-hosted ubuntu-latest runner, so no extra setup is needed.
Use cases
- Build & deploy names. Tag a CI build as swift-river-mellow-bolt instead of 7c4f9a2. Easier to refer to in standups, easier to find in chat history.
- Commit references in chat. Pasting a SHA into Slack gets ignored; pasting canyon-jam-telescope-creek gets read.
- Session and request IDs in logs. When grepping across services or saying an ID out loud on a call, words beat hex.
- Backup and snapshot names. Restoring vault-bronze-falcon-river is less terrifying than restoring b8f9c1d2…
- Fingerprint comparison. Comparing SSH or TLS fingerprints visually is much faster as four words than as 40 hex characters.
- Asset / version labels. Give your build artifacts, model checkpoints, or dataset snapshots a name humans can talk about.
Comparison with other identifier formats
| Format | Example | Memorable | Collision space |
|---|---|---|---|
| SHA-1 hex | f3527e4ef32f… | No | 2¹⁶⁰ |
| UUID v4 | 550e8400-e29b-41d4-a716-… | No | 2¹²² |
| Base58 (12 chars) | 5KQwrPbwdL5M | Somewhat | ~70 bits |
| HumanHash (4 words) | canyon-jam-telescope-creek | Yes | 2³² ≈ 4.3 B |
| Petname / coolname libraries | quiet-blue-finch | Yes | Varies |
HumanHash is unique in being a deterministic projection of an existing identifier — it does not replace your UUID or hash, it shadows it with a name humans can read. Pair the two.
Frequently asked questions
What is HumanHash? +
How does the algorithm work? +
Is the conversion reversible? +
Is it safe to use for security tokens or authentication? +
Is the API free? Are there rate limits? +
Can I self-host or vendor the algorithm? +
How many unique outputs are possible? +
Who runs humanhash.dev? +
The 256-word vocabulary
Outputs are drawn from a curated list of 256 short, pronounceable English words, grouped into eight themed categories of 32. The list avoids ambiguous spellings, near-homophones, and words that read badly when chained.
Colors (32)
aqua, azure, beige, bronze, brown, cherry, coral, cream, cyan, gold, grey, hazel, indigo, ivory, jade, khaki, lemon, lilac, lime, magenta, maroon, mauve, olive, peach, pink, plum, ruby, sage, sand, teal, violet, white
Animals (32)
alpaca, badger, beaver, bison, cobra, crane, deer, dingo, eagle, falcon, ferret, fox, geese, heron, jaguar, koala, kookaburra, lemur, lynx, moth, otter, panda, pelican, quail, raven, shark, sloth, swan, tiger, trout, vulture, zebra
Planets & space (32)
asteroid, comet, cosmos, crater, eclipse, galaxy, halo, jupiter, mars, mercury, meteor, nebula, neptune, orbit, planet, quasar, rocket, satellite, saturn, sky, solar, space, star, sun, telescope, terra, titan, universe, uranus, venus, vortex, zenith
Nature & geography (32)
bluff, cairn, canyon, coast, creek, desert, dune, forest, glacier, grove, hill, horizon, island, jungle, knoll, lake, meadow, moss, ocean, peak, puddle, ridge, river, stream, swamp, thistle, trail, valley, volcano, wave, woods, yarrow
Food & fruit (32)
apple, berry, bread, cake, clove, cookie, dough, grape, herb, honey, jam, juice, kiwi, maize, melon, mint, muffin, noodle, oats, onion, pesto, pickle, pie, rind, roast, spice, sugar, toast, vanilla, waffle, yeast, zest
Adjectives (32)
agile, brave, calm, clever, crisp, daring, deep, easy, fierce, flat, giant, great, happy, heavy, high, light, lively, loud, lucky, mellow, quick, quiet, rapid, ready, sharp, silent, smart, smooth, solid, swift, vast, vivid
Objects & concepts (32)
anchor, beacon, bolt, bridge, canvas, cipher, clock, coin, crown, diamond, echo, flare, ghost, glyph, hammer, helix, jewel, key, ledger, locket, maze, moment, needle, puzzle, quill, scroll, shield, signal, spirit, token, tower, vault
Verbs & actions (32)
bounce, capture, dash, drift, enter, escape, fly, glide, grasp, halt, jump, launch, lift, march, move, pedal, plunge, quiver, race, roam, scan, seek, shine, soar, spin, spring, steer, stride, thrust, touch, travel, weave
No guarantees
This service is provided as is, with no uptime or availability guarantees and no promise that it will exist forever. That said, we run it for our own production workloads, so it isn't going anywhere in the foreseeable future. If you depend on it, consider vendoring the algorithm — it's small.
About
HumanHash is operated by Pilvia Oy, a Finnish cloud company. We use it internally to label builds, deploys, and snapshots, and have opened it up because the algorithm is generally useful.
The humanhash concept originated as a small Python library by Zachary Voase. This implementation is an independent TypeScript rewrite running on Cloudflare Workers, with a curated wordlist of our own.