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/f3527e4ef32f9d8b59ead6b7b70a843c3da1c105

Response:

{
  "inputHash": "f3527e4ef32f9d8b59ead6b7b70a843c3da1c105",
  "hash": "canyon-jam-telescope-creek"
}

How it works

HumanHash maps any hexadecimal string to a short, pronounceable name in three steps:

  1. Parse the hex input into a byte array.
  2. Compress those bytes into N equal segments (N = 4 by default) and XOR the bytes inside each segment down to a single byte.
  3. 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

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? +
HumanHash is a free REST API that converts hexadecimal digests — like SHA-1, SHA-256, MD5, or UUIDs — into short, memorable four-word names such as canyon-jam-telescope-creek. The same input always produces the same output, so you can use the words anywhere you would otherwise paste a hash that humans need to read, compare, or say out loud.
How does the algorithm work? +
The hex input is parsed into bytes, those bytes are split into N equal segments (N = 4 by default), each segment is XOR-compressed down to a single byte, and each resulting byte (0–255) selects one word from a fixed 256-word list. The mapping is deterministic and stateless — there is no database lookup and no randomness.
Is the conversion reversible? +
No. HumanHash is one-way and lossy by design. The four-word output represents roughly 32 bits (about 4.3 billion combinations) regardless of how long the input was, so multiple distinct hashes can collide to the same name. Treat the words as a fingerprint, not an identifier you can decode back into the original digest.
Is it safe to use for security tokens or authentication? +
No. With only ~4.3 billion possible outputs, HumanHash names are trivial to brute-force and were never designed for security. Use them for human-friendly labels next to a real identifier, not as a replacement for one.
Is the API free? Are there rate limits? +
Yes, the API is free to call and CORS is open. There are no hard rate limits at the moment, but please be reasonable — the service is provided as-is on a best-effort basis. If you expect significant traffic, vendor the algorithm into your own code (it is a few dozen lines) or self-host.
Can I self-host or vendor the algorithm? +
Yes. The original humanhash concept is a small, public-domain Python library by Zachary Voase. The TypeScript implementation behind humanhash.dev is intentionally tiny and easy to copy into your own project. You only need the wordlist (256 strings) and a short compress-and-map function.
How many unique outputs are possible? +
With the default four words drawn from a 256-word list, there are 256⁴ = 4,294,967,296 possible names — the same as a 32-bit space. Increase the word count if you need more.
Who runs humanhash.dev? +
It is operated by Pilvia Oy. We use it for our own production tooling — build names, deploy IDs, internal logs — which is why it is publicly available. It runs on Cloudflare Workers.

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.