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ódhossz | Megnevezhető értékek | Gyakorlatban |
| 4 karakter | 624 = 14 776 336 | Elég olyan számlálóhoz, amely nyolc számjegy alatt marad, és egy telefonszám helyével elfér. |
| 6 karakter | 626 = 56 800 235 584 | Az azonosítókód szokásos alakja. Egy tízjegyű decimális azonosító hat karakterbe fér. |
| 7 karakter | 627 = 3 521 614 606 208 | Ké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 karakter | 6211 = 52 036 560 683 837 093 888 | Tö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ális | 0-9, majd A-Z, majd a-z | 0-9, majd a-z, majd A-Z | A-Z, majd a-z, majd 0-9 |
| 0 | 0 | 0 | A |
| 61 | z | Z | 9 |
| 62 | 10 | 10 | BA |
| 12 345 | 3D7 | 3d7 | DNH |
| 1 234 567 890 | 1LY7VK | 1ly7vk | BViHfU |
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ód | Olvasva 0-9 A-Z a-z | Olvasva 0-9 a-z A-Z | Olvasva A-Z a-z 0-9 |
| 3D7 | 12 345 | 13 957 | 211 665 |
| 1LY7VK | 1 234 567 890 | 1 624 950 792 | 48 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ás | Bit karakterenként | Méret a bemenethez képest | Megjegyzések |
| Base16 (hex) | 4 | 200% | Két karakter bájtonként, könnyen olvasható, nincs keresendő ábécé. |
| Base32 | 5 | 160% | 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. |
| Base64 | 6 | 133% | Mindenütt az alapértelmezett, a +, / és = árán, amelyek kódolást igényelnek. További információ: Base64 átalakító. |
| Ascii85 / Base85 | 6,4 | 125% | 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.