Base62 kódolás / dekódolás

Számot vagy bájtsort alakíthat át Base62-vel: 62 karakter, számjegyekből, nagybetűkből és kisbetűkből, amelyek közül egyik sem igényel kódolást URL-lekérdezésben vagy HTML-szövegben. Ezért íródnak így a rövid linkek és az automatikusan növekvő azonosítók. Két mód van: decimális szám (egy azonosító rövid kóddá alakul) és bájtok (szöveges vagy hexadecimális bemenet). Még: Base64 | Base32 / Base58 | Base91.
Minden feldolgozás helyben, a böngészőben történik — az adatok soha nem töltődnek fel szerverre.

Ha a Base62 fogalma új, Mi a Base62 — egyszerű nyelven elmagyarázva (kidolgozott példákkal, a három ábécével és a csapdákkal).
Ábécé:
Az eredmény kitöltése rögzített szélességre: 0 = nincs kitöltés. A kitöltés a kiválasztott ábécé nulla karakterét ismétli, ezért ugyanaz a szám a betűk-először ábécében másképp töltődik ki.
Működés:
A bemenet:
Működés:
A kimenet formátuma:
A Ctrl+Enter a bemenetben futtatja az aktív módot.
A Kódolás vagy a Dekódolás választható, a művelet a műveleti gombbal indítható. Az Önteszt gomb lefuttatja az összes dokumentált mintát, minden 0–64 bájtos hosszt és decimális számok széles körét mindhárom ábécén keresztül, és az eredményszámot itt jelenti.
A három ábécé teljes kiírásban: A Base62-nek nincs szabványügyi testülete, ezért az ábécé nincs garantálva a megvalósítások között. Ezek a három sorrend, amelyek ténylegesen előfordulnak; mindegyik karakterenként, értékével együtt van kiírva, így bármely eredmény visszavezethető arra a pontos ábécére, amely létrehozta. A kiemelt cella az a karakter, amely nullát jelent, és ez nem ugyanaz a karakter mindhárom sorrendben.
A Base62 mindhárom sorrendben kis- és nagybetű-érzékeny: egy nagybetű és a kisbetűs alakja szinte mindig más értéket jelöl, ezért az a kód, amely kisbetűsítésen ment át, nem hiba, hanem másik szám.
A Base62 mindhárom sorrendben kis- és nagybetű-érzékeny: egy nagybetű és a kisbetűs alakja szinte mindig más értéket jelöl, ezért az a kód, amely kisbetűsítésen ment át, nem hiba, hanem másik szám.
Ugyanazon bájtok hossza az egyes kódolásokban:
Mekkora bemenetet fogad el az oldal, és miért: minden mód egyetlen nagy egész számon keresztül konvertál, és a nagy egész számú átalakítás ideje a hossz négyzetével arányos. Ez nem ezen oldal sajátossága, hanem a formátumé: bármely valódi Base62-t megvalósító eszköz ugyanilyen alakú korlátot mutat. Az alábbi számok egy időzítő-eszköztől származnak, amely az oldal saját rutinjait futtatja, nem egy futó lapból, ezért szándékosan pesszimisták: egy asztali böngésző általában többszörösen gyorsabban fejezi be, és ez a különbség fedezi a lassú telefonokat. A határok úgy vannak beállítva, hogy még a lassú eset is befejeződjön, és ne fagyassza le a lapot.
A lágy határ fölött az első kattintás elmagyarázza a költséget, és a futtatás előtt második kattintást kér; a kemény határ fölött az oldal elutasítja a futtatást, ahelyett hogy több másodpercre lefagyasztaná a lapot, és semmi nem jelezne előrehaladást. A bájtmód kódoláskor bájtban, dekódoláskor karakterben számol, és a karakterszám mindig a nagyobb: 2 048 bájt kb. 2 751 karakterként íródik, ami a karakterhatáron túl van, így az oldalon kb. 1 520 bájt vagy kevesebb hasznos adat megy át oda-vissza. Tetszőleges méretű, nyers bináris adatnál a Base64 és a Base91 lineáris, és nincs ilyen korlátjuk.
Mi a Base62?

A Base62 olyan módja egy szám leírásának, amely csak azokat a karaktereket használja, amelyek bárhová bemásolva is épségben maradnak: a tíz számjegyet, a 26 nagybetűt és a 26 kisbetűt. Nincs írásjel, nincs szóköz, nincs kitöltőkarakter, és semmi, amit URL-be, fájlnévbe, sütibe vagy adatbázis-kulcsba tétel előtt százalékkódolni kellene. Tíz plusz 26 plusz 26 az 62, és innen a név.

A 30 másodperces változat: a 12345 szám 3D7-ként íródik, az 1234567890 pedig 1LY7VK-ként. A visszafelé irány ugyanaz a művelet fordítva, és pontosan azt az ábécét igényli, amely a kódot létrehozta — másik ábécé ugyanazt a hat karaktert hibaüzenet nélkül egy másik számmá alakítja vissza.

Ez az oldal két kapcsolódó feladatot lát el, és a kettő közötti különbség fontosabb, mint bármi más az oldalon:

  • Egész szám mód: a bemenetet számként kezeli. Az 1234567890 decimális azonosító 1LY7VK lesz, a bemenet vezető nullái nem részei az értéknek, ezért nem jönnek vissza.
  • Bájtmód: a bemenetet bájtsorként kezeli. A bájtok egyetlen óriási nagy-endian egész számként olvasódnak, majd 62-vel osztódnak - ugyanaz az aritmetika, más mennyiségen. Itt a vezető nulla bájtok száma megmarad, bájtonként egy nulla karakterrel.
Honnan jön a 62, és mibe kerül

A 62 nem kettő hatványa, és ez az egy tény meghatározza az egészet. Az ismert kódolások rögzített bitcsoportokra vágják a bemenetet: 4 bit egy hexadecimális karaktert ad, 6 bit egy Base64-karaktert, 5 bit egy Base32-karaktert. A Base62 ezt nem tudja, mert egész számú bit sem illik 62 értékű karakterbe — az 5 bit csak 32 értéket, a 6 bit 64 értéket nevez meg. Ezért a Base62 aritmetikán megy keresztül: az egész bemenetet egyetlen egész számként olvassa be, és 62-es alapon írja ki.

Egy karakter így log2(62) = 5,954 bit-et hordoz, ami nagyon közel van a Base64 6 bitjéhez, a decimális módban pedig egy karakter log62(10) = 1,792 decimális számjegyet helyettesít. Néhány következmény, amelyet érdemes ismerni a hossz kiválasztása előtt:

KódhosszMegnevezhető értékekGyakorlatban
4 karakter624 = 14 776 336Elég olyan számlálóhoz, amely nyolc számjegy alatt marad, és egy telefonszám helyével elfér.
6 karakter626 = 56 800 235 584Az azonosítókód szokásos alakja. Egy tízjegyű decimális azonosító hat karakterbe fér.
7 karakter627 = 3 521 614 606 208Két nagyságrenddel túlmutat egy 32 bites számláló tartományán, egy rövid link slugjának szélességében.
11 karakter6211 = 52 036 560 683 837 093 888Több mint 264 = 18 446 744 073 709 551 616, így egy teljes 64 bites szám tizenegy karakterbe fér.

Fordítva: 1 000 decimális számjegyhez kb. 558 karakter kell, 4 096 decimális számjegyhez pedig 2 285. A megtakarítás valós, de korlátos: a Base62 kb. 44%-kal rövidíti le a decimális számot, és sosem előzi meg a legsűrűbb nyomtatható kódolásokat, mert az 5,954 bit karakterenként egyszerűen kevesebb, mint a 6,4 vagy a 6.5.

Egész szám mód: mi történik a vezető nullákkal

Egy egész számnak egyetlen kanonikus leírt alakja van, és ez az ábécé nulla karakterével kezdődik, ami a két számjegy-először sorrendben 0, a betűk-először sorrendben pedig A. Az első értelmes karakter bal oldalán álló minden karakter kitöltés, a kitöltés pedig nem része az értéknek: a 00012345 és a 12345 is 3D7-tá válik. Ha rögzített szélesség kell — például egy hétkarakteres kód, amelynek oszlopba kell igazodnia — az oldal Az eredmény kitöltése rögzített szélességre mezője addig ismétli a nulla karaktereket, amíg el nem éri a szélességet, így a 12345 7-es szélességgel a számjegy-először ábécében 00003D7, a betűk-először ábécében pedig AAAADNH alakot ölt. A kitöltés kozmetikai: ezek a vezető karakterek nem adnak hozzá az értékhez, és bármelyik sztring dekódolása visszaadja a 12345-öt, mert a 0 × 626 és a 0 × 625 egyaránt nulla, bármelyik karakter írja is le a nullát.

Ezért a kitöltött sztring dekódolása is működik, az oldal pedig jelzi, hány vezető karakter volt nulla, hogy a „a kód hét karakter” és az „az értékhez három karakter kellett” közötti különbség sosem legyen rejtély.

Bájtmód: ugyanaz az aritmetika bájtsoron

A bájtmód a bemeneti bájtokat egyetlen nagy-endian egész számként olvassa be — az egész bájtsort egyetlen számként kezeli, bármilyen hosszú is — és ezt a számot 62-es alapon írja ki. Mivel egy bájt 8 bit, egy karakter pedig 5,954 bitet nevez meg, a bájtmód nem tömörítés: kb. 134% méretet igényel a bemenethez képest, ami kissé rosszabb, mint a Base64 133%-a. A fenti méretek táblázatában használt 92 bájtos mintán a 92 bájt 124 Base62-karakterként íródik, a Base64 pedig szintén 124-et ír (ebből 123 a = kitöltés előtt). A Base62 sűrűségben veszít a Base64-gyel szemben, a karakterbiztonságban viszont nyer, és ezt a kompromisszumot köti meg minden rövid link és meghívókód szándékosan.

A vezető nulla bájtok megmaradnak, és ezt könnyű rosszul érteni mindkét irányban. Két vezető nulla bájt, amelyet 0x01 követ, a számjegy-először ábécében 001-ként, a betűk-először ábécében AAB-ként íródik, mert a vezető karakterek nullát jelölnek, bájtonként egyet. Egyetlen 0x00 bájtból álló bájtsor az egyetlen 0 karakterként íródik, egyetlen 0x01-ből álló bájtsor pedig 1-ként. Ez az egyetlen hely, ahol a bájtmód és az egész szám mód eltérően viselkedik, miközben ugyanazt az algoritmust futtatják.

Ennek ára, hogy a bájtmód az aritmetika négyzetes időigényét örökli: 1 024 bájt becslés szerint kb. egy harmad másodperc, 2 048 bájt kb. 1,3 másodperc, ugyanazok az adatok, mint a fenti határértéktáblázatban. Ezért a bájtmód itt 2 048 bájtra van korlátozva kimenetnél, és 2 048 karakterre visszafelé — 2 048 bájt kb. 2 751 karakterként íródik, ezért kb. 1 520 bájt a legnagyobb hasznos adat, amely ezen az oldalon oda-vissza átmegy — és ezért az oldal bájtmódja kis értékek referenciája, nem helyettesítője a Base64 vagy a Base91 használatának valódi fájlokon.

A három ábécé, és miért az ábécé a lényeg

Egy ábécé karakterei rögzített sorozatot alkotnak, és egy karakter értéke a sorozatbeli helyzete. A sorozat átrendezése minden karakter jelentését megváltoztatja. Három sorrend terjedt el széles körben, és az alábbi ugyanazt a számot írja le mindegyikben, három módon:

Decimális0-9, majd A-Z, majd a-z0-9, majd a-z, majd A-ZA-Z, majd a-z, majd 0-9
000A
61zZ9
621010BA
12 3453D73d7DNH
1 234 567 8901LY7VK1ly7vkBViHfU

Ha az utolsó három oszlop egyetlen ábécének tekinthető, egységes séma adódik. Ha felcserélhetőnek tekintik őket, az séma szétesik, mert a dekódolás a legrosszabb módon ábécé-vak: a bemenet minden karaktere mindhárom ábécében szerepel, így a rossz ábécé egyáltalán nem ad hibát, csak egy másik számot.

KódOlvasva 0-9 A-Z a-zOlvasva 0-9 a-z A-ZOlvasva A-Z a-z 0-9
3D712 34513 957211 665
1LY7VK1 234 567 8901 624 950 79248 723 527 772

A kis- és nagybetűk kérdése a csapda második, élesebb változata. A Base62 minden sorrendben kis- és nagybetű-érzékeny, ezért a kód kisbetűssé alakítása csendben átírja: az 1LY7VK a számjegyek-először ábécében 1 234 567 890, míg az 1ly7vk ugyanabban az ábécében 1 624 950 792 — ugyanakkor a számjegyek-majd-kisbetűk ábécében éppen 1 234 567 890, mert ez a sorrend pontosan a számjegyek-először sorrend a két betűcsoport felcserélésével. A nulla karakter sem közös: a két számjegy-először sorrend nullaként 0-t ír, míg a betűk-először sorrend A-t, így ez az ábécé nem is számjeggyel kezdődik.

A Base62 más kódolások mellett
KódolásBit karakterenkéntMéret a bemenethez képestMegjegyzések
Base16 (hex)4200%Két karakter bájtonként, könnyen olvasható, nincs keresendő ábécé.
Base325160%Kis- és nagybetű-érzéketlen és emberi diktálásra alkalmas, a csoport legpazarlóbbja.
Base36 (0-9 a-z)~5,17~155%Csak számjegyek és kisbetűk, így túléli a kisbetűsítést. 12345 az 9ix.
Base58~5,86~137%Címekhez választva, nem sűrűségért: négy hasonló karakter kimarad, nem sorrendezik. További információ: Base32 / Base58.
Base62~5,95~134%Minden karakter számjegy vagy betű, így semmit sem kell kódolni. A sűrűsége a Base58 és a Base64 között van.
Base646133%Mindenütt az alapértelmezett, a +, / és = árán, amelyek kódolást igényelnek. További információ: Base64 átalakító.
Ascii85 / Base856,4125%5 karakter 4 bájtonként, de 85-tel oszt, és ábécéjét idézőjelbe kell tenni. További információ: Ascii85.
Base91~6,5~123%Ezek közül a legsűrűbb, és kimenete a legkevésbé biztonságos beillesztéskor kódolás nélkül. További információ: Base91.

A százalékok közelítő, kerekített költségek; egy valódi, 92 bájtos bemenet mért karakterszámai az oldal fenti méretek táblázatában találhatók. Egész szám módban az összehasonlítás fordított, mert a bemenet bájtok helyett decimális szöveg: itt a Base62 kb. 44% rövidebb, mint a helyettesített számjegyek, a Base36 pedig kb. 36%-kal rövidebb, ezért az azonosító-kód rendszerint Base62 vagy Base36, és nem Base58.

Mi nem a Base62
  • Nem szabvány. Nincs RFC és nincs specifikáció. Egyetlen szabványügyi testület sem határozta meg a Base62-t, ezért az ábécé nem garantált, és ezért ez az oldal mindhárom sorrendet kiírja, ahelyett hogy csendben választana egyet.
  • Nem titkosítás. Ez csak alapváltás, semmi más. Akinek megvan az ábécé, az egy menetben visszafordítja, és nincs kulcs, nincs só, és semmilyen titkosság sincs.
  • Nem tömörítés. A bájtmód az adatot körülbelül egyharmadával nagyobbítja. Az egész szám mód csak azért tűnik tömörítésnek, mert a decimális szöveg eleve pazarló módja egy szám leírásának.
  • Nem kis- és nagybetű-érzéketlen. A Base32 kisbetűsre alakítható és visszaolvasható; a Base62 nem. Az a kód, amely olyan rendszeren megy át, amely normalizálja a kis- és nagybetűket, sérült kód.
  • Nem önellenőrző. Nincs ellenőrző összeg és nincs ellenőrző karakter, ezért egyetlen rossz karakter is érvényesnek tűnő, más értékű eredményt ad. Ha ez számít, a Bitcoin-sorrend ellenőrző összeggel jár — részletek: a Base32 / Base58 Base58Check-szakaszát.
  • Nem fix hosszúságú. A karakterek száma az értékkel nő, ezért az 1-től induló számláló, amely eléri a 627-et, egy karakterről nyolcra nő. Ha állandó oszlopra van szükség, rögzített szélességre kell kitölteni.
Valóban csapdába ejtő buktatók
  • Az ábécé kilenc rejtélyből tízre ad választ. Ha egy másik eszköz ugyanarra a számra más kódot ad, a gyanú előtt hasonlítsa össze a két ábécét karakterenként. A fenti táblázat ugyanazt az értéket mutatja három ábécében, és mindhárom helyes.
  • A rossz ábécé csendben hibázik. Erre nincs hibaút: a 3D7 12 345-re, 13 957-re vagy 211 665-re dekódolódik, csak attól függően, melyik sorrend feltételezett. Az első karakter a legvalószínűbb gyanús, mert az lehet nullás kitöltés, és az is ellenőrizendő, hogy az ábécé elején számjegyek vagy betűk állnak-e.
  • A vezető nullák két különböző dolgot jelentenek. Egész szám módban a 00012345 és a 12345 ugyanaz a szám, és azonosan íródnak ki. Bájtmódban a vezető nulla bájt adat, és egy plusz nulla karakterként íródik ki. Ezek közül bármelyik karakter elhagyása megváltoztatja a bájtsort.
  • A kis- és nagybetűk normalizálása elpusztít egy kódot. Egy e-mail-cím, gépnév vagy Windows-útvonal szállítás közben kisbetűssé válhat. A Base62-kód ezt nem éli túl, és ezért létezik még a Base36 is.
  • A hosszú bemenetek nemcsak nagyok, hanem lassúak is. Az átalakítás az egész bemeneten egyszerre végzett aritmetika, így a bemeneti hossz megduplázása az időt négyszeresére növeli. Az oldal a mért határok fölött nem fagy le, hanem elutasítja a bemenetet; a fenti méretek táblázata adja a mért számokat.
  • Egy Base62-sztring semmit nem bizonyít. Mivel szinte bármely számjegyekből és betűkből álló sztring hibátlanul dekódolódik, egy tetszőleges URL-slug is dekódolódik valamilyen számra. A kód csak akkor jelent valamit, ha a kiállító rendszer a hozzárendelést is tárolja.
Gyors válaszok

„Miért ad egy másik Base62-eszköz más kódot ugyanarra a számra?”

Azért, mert az ábécé eltér. A Base62-nek nincs olyan specifikációja, amellyel ellentmondhatna, ezért a megvalósítások sorrendet választanak: számjegyek és nagybetűk először, számjegyek és kisbetűk először, vagy betűk a számjegyek előtt. Az oldal tetején lévő ábécéválasztóval mindhárom válasz egymás mellett látható.

„Biztonságos a Base62 egy URL-ben?”

Igen, mindhárom sorrendben. Mind a 62 karakter escape nélküli betű vagy számjegy, így egyiket sem bontja százalékhármasra egy lekérdezési sztring, és egyik sem zár le URL-t, útvonal-szegmenst vagy HTML-attribútumot. Ez az egyetlen oka annak, hogy a rövid linkek Base62-ek, és nem Base64-ek.

„Melyik kisebb, a Base62 vagy a Base64?”

Bájtoknál a Base64 valamivel kisebb: kb. 133% a bemenethez képest, szemben a kb. 134%-kal. A fenti 92 bájtos mintán a kettő 124 karakteren áll döntetlent. Decimális számoknál a Base62 kb. 44%-kal rövidíti a szöveget, és itt van a gyakorlati nyereség.

„Dekódolható egy Base64-sztring ezzel az oldallal?”

Nem, és nem jelzi, ha hibázott. A két ábécé mind a 62 karakterben átfed, ezért egy Base64-sztring itt is általában „érvényes” bemenet, és egyszerűen egy másik számra dekódolódik. Base64-hez a Base64 való.

„Van a Base62-kódnak maximális hossza?”

Nem, elvben az algoritmusnak nincs felső korlátja. A gyakorlatban az oldal 4 096 decimális számjegynél vagy 2 048 bájtnál megáll, mert a mögötte álló aritmetika négyzetes, és a lap lefagyna, a képernyőn pedig semmi sem magyarázná, miért. A fenti határértéktáblázat a mért számokat sorolja fel.

„Honnan tudható, hogy az oldal eredménye helyes?”

Az Önteszt gomb minden dokumentált mintát lefuttat, minden bájthosszt 0-tól 64-ig, és decimális számok széles körét mindhárom ábécén keresztül, összehasonlítva a kimeneti értékeket a bemenetiekkel, és újra ellenőrzi, hogy mindhárom ábécé mind a 62 karaktere biztonságos egy URL-ben. A Minta gomb emellett összeveti a három eredményt az oldal adatfájljában rögzített értékekkel, amelyeket egy második, független, natív nagy egész számú megvalósítás ellenőrzött, a webhely tesztelőeszközei között.

Szabványok és hivatkozások

Nincs itt megvalósítandó szabvány: a Base62 konvenció, nem specifikáció, és a fent kiírt három ábécé az, amely valódi szoftverekben megjelenik. Ez az oldal a webhely saját nagy egész számú rutinjaival valósítja meg, egyszerű aritmetikával, számjegytömbökön, így semmilyen méretet nem korlátoz a JavaScript számtípusa.

Az oldal szövegét ehhez a webhelyhez írták. Az oldal minden kidolgozott példáját az oldal saját kódja állította elő, majd egy második, független megvalósítás ellenőrizte, natív nagy egész számokkal; ez a megvalósítás a webhely tesztelőeszközei között található. Ugyanez a megvalósítás ellenőrizte az adatfájl minta- és méretadatait.