humanhash.dev

Des noms mémorisables pour vos empreintes hexadécimales.

Transformez f3527e4ef32f… en canyon-jam-telescope-creek. Une petite API REST gratuite pour SHA-1, SHA-256, MD5, UUID et tout ce qui peut s'encoder en hex.

Essayer

Faites un GET sur n'importe quelle empreinte hex à /api/v1/hash/<hex>. L'endpoint est ouvert, déterministe et CORS-friendly :

https://humanhash.dev/api/v1/hash/f3527e4ef32f9d8b59ead6b7b70a843c3da1c105

Réponse :

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

Fonctionnement

HumanHash transforme n'importe quelle chaîne hexadécimale en un nom court et prononçable en trois étapes :

  1. Parser l'entrée hex en tableau d'octets.
  2. Compresser ces octets en N segments égaux (N = 4 par défaut) et XOR-réduire chaque segment à un seul octet.
  3. Mapper chaque octet résultant (0–255) à une entrée d'une liste de 256 mots, puis joindre par tirets.

La sortie est totalement déterministe — la même entrée donne toujours le même nom — et l'algorithme est sans état, sans base de données ni aléa. Quatre mots tirés d'une liste de 256 donnent 256⁴ ≈ 4,3 milliards de combinaisons, soit environ une empreinte de 32 bits : confortable pour qu'un humain reconnaisse des déploiements ou builds individuels, mais pas un substitut au hash sous-jacent quand la résistance aux collisions compte.

Référence de l'API

GET https://humanhash.dev/api/v1/hash/{hex}

Paramètre de chemin
hex— toute chaîne hexadécimale. Pas de limite de longueur ; les entrées plus longues sont XOR-compressées avant mapping.
Réponse
JSON : { "inputHash": string, "hash": string }
Mots
Toujours 4 mots séparés par des tirets, depuis une liste fixe de 256.
Authentification
Aucune. CORS ouvert.
Limites
Meilleur effort, sans limites strictes. Vendorisez ou auto-hébergez pour un usage intensif.

Exemples de code

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

Les UUID fonctionnent aussi — retirez d'abord les tirets :

curl https://humanhash.dev/api/v1/hash/550e8400e29b41d4a716446655440000
# => {"inputHash":"550e8400e29b41d4a716446655440000","hash":"vault-lift-onion-lilac"}

Exemple : GitHub Actions

Un pattern courant consiste à dériver un nom mémorisable depuis github.sha et à l'utiliser à côté du SHA — par exemple pour taguer une image Docker avec les deux. C'est exactement ainsi que nous utilisons HumanHash dans nos propres pipelines de production :

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 }}

Chaque push obtient deux tags : le SHA exact pour la reproductibilité, et un nom convivial comme swift-river-mellow-bolt réellement utilisable en chat, dashboards et réunions. Le binaire jq est préinstallé sur le runner ubuntu-latest hébergé par GitHub, aucune installation supplémentaire requise.

Cas d'usage

Comparaison avec d'autres formats d'identifiants

Format Exemple Mémorisable Espace de collision
SHA-1 hex f3527e4ef32f… Non 2¹⁶⁰
UUID v4 550e8400-e29b-41d4-a716-… Non 2¹²²
Base58 (12 car.) 5KQwrPbwdL5M Un peu ~70 bits
HumanHash (4 mots) canyon-jam-telescope-creek Oui 2³² ≈ 4,3 Md
Petname / coolname quiet-blue-finch Oui Variable

HumanHash est singulier : c'est une projection déterministe d'un identifiant existant — il ne remplace pas votre UUID ou hash, il le double avec un nom lisible. Utilisez les deux ensemble.

Questions fréquentes

Qu'est-ce que HumanHash ? +
HumanHash est une API REST gratuite qui convertit des empreintes hexadécimales — comme SHA-1, SHA-256, MD5 ou UUID — en noms courts et mémorisables de quatre mots comme canyon-jam-telescope-creek. La même entrée produit toujours la même sortie, donc vous pouvez utiliser les mots partout où vous colleriez normalement un hash qu'un humain doit lire, comparer ou dire à voix haute.
Comment fonctionne l'algorithme ? +
L'entrée hex est parsée en octets, ces octets sont divisés en N segments égaux (N = 4 par défaut), chaque segment est XOR-compressé en un seul octet, et chaque octet résultant (0–255) sélectionne un mot dans une liste fixe de 256. Le mapping est déterministe et sans état — pas de lookup en base, pas d'aléa.
La conversion est-elle réversible ? +
Non. HumanHash est unidirectionnel et avec perte par conception. La sortie de quatre mots représente environ 32 bits (environ 4,3 milliards de combinaisons) quelle que soit la longueur de l'entrée, donc plusieurs hashes distincts peuvent collisionner sur le même nom. Traitez les mots comme une empreinte, pas comme un identifiant qu'on peut décoder pour retrouver le hash d'origine.
Est-ce sûr pour des tokens ou de l'authentification ? +
Non. Avec seulement ~4,3 milliards de sorties possibles, les noms HumanHash sont triviaux à brute-forcer et n'ont jamais été conçus pour la sécurité. Utilisez-les comme étiquettes lisibles à côté d'un identifiant réel, pas en remplacement.
L'API est-elle gratuite ? Y a-t-il des limites ? +
Oui, l'API est gratuite et CORS est ouvert. Aucune limite stricte pour l'instant, mais soyez raisonnable — le service est fourni tel quel en meilleur effort. Si vous attendez du trafic significatif, vendorisez l'algorithme dans votre code (quelques dizaines de lignes) ou auto-hébergez.
Puis-je auto-héberger ou vendoriser l'algorithme ? +
Oui. Le concept original humanhash est une petite bibliothèque Python du domaine public par Zachary Voase. L'implémentation TypeScript derrière humanhash.dev est volontairement minuscule et facile à copier dans votre projet. Vous n'avez besoin que de la liste de mots (256 chaînes) et d'une courte fonction compresser-et-mapper.
Combien de sorties uniques sont possibles ? +
Avec les quatre mots par défaut tirés d'une liste de 256, il y a 256⁴ = 4 294 967 296 noms possibles — équivalent à un espace de 32 bits. Augmentez le nombre de mots si besoin.
Qui opère humanhash.dev ? +
C'est opéré par Pilvia Oy. Nous l'utilisons pour nos propres outils de production — noms de builds, IDs de déploiement, logs internes — c'est pour ça qu'il est public. Ça tourne sur Cloudflare Workers.

Le vocabulaire de 256 mots

Les sorties sont tirées d'une liste curée de 256 mots anglais courts et prononçables, regroupés en huit catégories thématiques de 32. La liste évite les orthographes ambiguës, les quasi-homophones et les mots qui se lisent mal enchaînés.

Couleurs (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

Animaux (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

Planètes & espace (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 & géographie (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

Nourriture & fruits (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

Adjectifs (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

Objets & 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

Verbes & 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

Sans garantie

Ce service est fourni tel quel, sans garantie de disponibilité et sans promesse d'exister éternellement. Cela dit, nous l'utilisons pour nos propres charges de production, donc il ne va pas disparaître à court ou moyen terme. Si vous en dépendez, envisagez de vendoriser l'algorithme — il est petit.

À propos

HumanHash est opéré par Pilvia Oy, une société cloud finlandaise. Nous l'utilisons en interne pour étiqueter builds, déploiements et snapshots, et l'avons ouvert parce que l'algorithme est utile en général.

Le concept humanhash est né d'une petite bibliothèque Python par Zachary Voase. Cette implémentation est une réécriture TypeScript indépendante tournant sur Cloudflare Workers, avec un vocabulaire propre.