humanhash.dev

Muistettavat nimet hex-tiivisteille.

Muunna f3527e4ef32f… muotoon canyon-jam-telescope-creek. Pieni, ilmainen REST API SHA-1:lle, SHA-256:lle, MD5:lle, UUID:ille ja kaikelle muulle, mitä voit esittää hex-muodossa.

Kokeile

Tee GET-pyyntö osoitteeseen /api/v1/hash/<hex> millä tahansa hex-tiivisteellä. Päätepiste on avoin, deterministinen ja tukee CORS:ia:

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

Vastaus:

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

Miten se toimii

HumanHash muuntaa minkä tahansa heksadesimaalisen merkkijonon lyhyeksi, lausuttavaksi nimeksi kolmessa vaiheessa:

  1. Jäsennä hex-syöte tavutaulukoksi.
  2. Pakkaa tavut N:ään yhtä suureen segmenttiin (oletuksena N = 4) ja XOR-yhdistä kunkin segmentin tavut yhdeksi tavuksi.
  3. Kuvaa jokainen tulostavu (0–255) yhdeksi sanaksi 256-sanaisesta listasta ja yhdistä sanat yhdysviivoin.

Tulos on täysin deterministinen — sama syöte tuottaa aina saman nimen — ja algoritmi on tilaton, ilman tietokantaa tai satunnaisuutta. Neljä sanaa 256-sanaisesta listasta antaa 256⁴ ≈ 4,3 miljardia yhdistelmää, mikä vastaa noin 32-bittistä sormenjälkeä: riittää yksittäisten julkaisujen tai buildien tunnistamiseen, mutta ei korvaa alkuperäistä hashia silloin, kun törmäyskestävyydellä on väliä.

API-dokumentaatio

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

Polkuparametri
hex— mikä tahansa heksadesimaalinen merkkijono. Pituutta ei ole rajoitettu; pidemmät syötteet XOR-pakataan ennen kuvausta.
Vastaus
JSON: { "inputHash": string, "hash": string }
Sanat
Aina 4 sanaa yhdysviivoin eroteltuna kiinteästä 256-sanaisesta listasta.
Tunnistus
Ei vaadita. CORS on avoin.
Käyttörajat
Best-effort, ei kovia rajoja. Vendoroi koodi omaan projektiisi tai isännöi itse, jos käyttö on raskasta.

Koodiesimerkit

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

UUID:t toimivat myös — poista ensin yhdysviivat:

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

Esimerkki: GitHub Actions

Yleinen tapa on johtaa muistettava nimi github.sha-arvosta ja käyttää sitä SHA:n rinnalla — esimerkiksi tagittamaan Docker-imagen molemmilla. Näin käytämme HumanHashia omissa tuotantoputkissamme:

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

Jokainen push saa kaksi tagia: tarkan SHA:n toistettavuutta varten ja ihmisystävällisen nimen, kuten swift-river-mellow-bolt — se on aidosti käyttökelpoinen chatissä, kojelaudoissa ja palavereissa. Komento jq on esiasennettu GitHubin ubuntu-latest-runnerille, joten lisäasennuksia ei tarvita.

Käyttötapaukset

Vertailu muihin tunnistemuotoihin

Muoto Esimerkki Muistettava Törmäysavaruus
SHA-1 hex f3527e4ef32f… Ei 2¹⁶⁰
UUID v4 550e8400-e29b-41d4-a716-… Ei 2¹²²
Base58 (12 merkkiä) 5KQwrPbwdL5M Osittain ~70 bittiä
HumanHash (4 sanaa) canyon-jam-telescope-creek Kyllä 2³² ≈ 4,3 mrd
Petname/coolname-kirjastot quiet-blue-finch Kyllä Vaihtelee

HumanHashin erikoisuus on, että se on deterministinen projektio olemassa olevasta tunnisteesta — se ei korvaa UUID:tä tai hashia, vaan antaa sille rinnalle nimen, jonka ihminen pystyy lukemaan. Käytä molempia yhdessä.

Usein kysytyt kysymykset

Mikä on HumanHash? +
HumanHash on ilmainen REST API, joka muuntaa heksadesimaaliset tiivisteet — kuten SHA-1, SHA-256, MD5 tai UUID:t — lyhyiksi ja muistettaviksi neljän sanan nimiksi, kuten canyon-jam-telescope-creek. Sama syöte tuottaa aina saman tuloksen, joten voit käyttää sanoja kaikkialla, missä muuten liittäisit hashin, jonka ihmisen pitää lukea, vertailla tai sanoa ääneen.
Miten algoritmi toimii? +
Hex-syöte jäsennetään tavuiksi, tavut jaetaan N:ään yhtä suureen segmenttiin (oletuksena N = 4), jokainen segmentti XOR-pakataan yhdeksi tavuksi, ja jokainen tulostavu (0–255) valitsee yhden sanan kiinteästä 256-sanaisesta listasta. Kuvaus on deterministinen ja tilaton — ei tietokantahakuja eikä satunnaisuutta.
Onko muunnos peruutettavissa? +
Ei. HumanHash on suunniteltu yksisuuntaiseksi ja häviölliseksi. Neljän sanan tulos edustaa noin 32 bittiä (noin 4,3 miljardia yhdistelmää) syötteen pituudesta riippumatta, joten useat eri hashit voivat törmätä samaan nimeen. Käsittele sanoja sormenjälkenä, ei tunnisteena, jonka voi purkaa takaisin alkuperäiseksi tiivisteeksi.
Onko turvallista käyttää tietoturva-tokeneihin tai tunnistautumiseen? +
Ei. Vain noin 4,3 miljardilla mahdollisella tuloksella HumanHash-nimet ovat triviaaleja brute-forcata, eikä niitä koskaan suunniteltu tietoturvakäyttöön. Käytä niitä ihmisystävällisinä merkintöinä oikean tunnisteen rinnalla, ei sen korvaajana.
Onko API ilmainen? Onko käyttörajoja? +
Kyllä, API on ilmainen ja CORS on avoin. Kovia rajoja ei tällä hetkellä ole, mutta käytä järkevästi — palvelua tarjotaan sellaisenaan best-effort-periaatteella. Jos odotat merkittävää liikennettä, vendoroi algoritmi omaan koodiisi (se on muutama kymmenen riviä) tai isännöi itse.
Voinko isännöidä itse tai vendoroida algoritmin? +
Kyllä. Alkuperäinen humanhash on Zachary Voasen pieni public-domain-Python-kirjasto. humanhash.dev:n TypeScript-toteutus on tarkoituksella pieni ja helppo kopioida omaan projektiin. Tarvitset vain sanalistan (256 merkkijonoa) ja lyhyen pakkaa-ja-kuvaa-funktion.
Kuinka monta ainutlaatuista tulosta on mahdollista? +
Neljällä sanalla (oletusarvo) 256-sanaisesta listasta on 256⁴ = 4 294 967 296 mahdollista nimeä — sama kuin 32-bittinen avaruus. Lisää sanojen määrää, jos tarvitset enemmän.
Kuka ylläpitää humanhash.dev:tä? +
Sitä ylläpitää Pilvia Oy. Käytämme sitä omiin tuotantotyökaluihimme — buildien nimiin, deploy-ID:ihin ja sisäisiin lokeihin — minkä takia se on julkisesti saatavilla. Se pyörii Cloudflare Workersissa.

256-sanainen sanasto

Tulokset poimitaan käsin kuratoidusta listasta, jossa on 256 lyhyttä ja helposti lausuttavaa englanninkielistä sanaa, jaettuna kahdeksaan teemaryhmään — kussakin 32 sanaa. Lista välttää epäselviä kirjoitusasuja, lähihomofoneja ja sanoja, jotka luetaan huonosti ketjutettuina.

Värit (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

Eläimet (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

Planeetat ja avaruus (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

Luonto ja maantiede (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

Ruoka ja hedelmät (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

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

Esineet ja käsitteet (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

Verbit ja toiminta (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

Ei takuita

Tätä palvelua tarjotaan sellaisena kuin se on, ilman käytettävyys- tai saatavuustakuita eikä lupausta, että se olisi olemassa ikuisesti. Käytämme sitä kuitenkin omiin tuotantotarpeisiimme, joten se ei ole katoamassa ihan lähiaikoina. Jos riippuvuus on kriittinen, harkitse algoritmin vendorointia — se on pieni.

Tietoa

HumanHashia ylläpitää Pilvia Oy, suomalainen pilviyritys. Käytämme sitä sisäisesti buildien, julkaisujen ja snapshotien merkitsemiseen, ja olemme avanneet sen, koska algoritmi on yleishyödyllinen.

Alkuperäinen humanhash-konsepti syntyi Zachary Voasen pienestä Python-kirjastosta. Tämä toteutus on itsenäinen TypeScript-uudelleenkirjoitus Cloudflare Workersilla, omalla räätälöidyllä sanastolla.