Kódování a dekódování Base62

Převeďte číslo nebo řetězec bajtů pomocí Base62: 62 znaků tvořených číslicemi, velkými a malými písmeny, z nichž žádný se nemusí escapovat v dotazu URL ani v textu HTML. Proto se krátké odkazy a automaticky inkrementované identifikátory píší takto. Dva režimy: desítkové číslo (identifikátor se stane krátkým kódem) a bajty (text nebo hexadecimální vstup). Dále: Base64 | Base32 / Base58 | Base91.
Veškeré zpracování probíhá lokálně ve vašem prohlížeči — vaše data se nikdy nenahrávají na žádný server.

Ještě jste nikdy neslyšeli o Base62? Co je Base62 — vysvětleno obecnou řečí (s příklady, třemi abecedami a pastmi).
Abeceda:
Doplnit výsledek na pevnou šířku: 0 = bez výplně. Výplň opakuje nulový znak zvolené abecedy, takže stejné číslo se v abecedě s písmeny napřed doplní jinak.
Jak to funguje:
Vstup je:
Jak to funguje:
Výstup jako:
Ctrl+Enter ve vstupu spustí aktivní režim.
Zvolte Kódovat nebo Dekódovat a klikněte na tlačítko akce. Tlačítko Autotest spustí všechny zdokumentované ukázky, každou délku od 0 do 64 bajtů a rozptyl desítkových čísel přes všechny tři abecedy, a výsledek uvede zde.
Tři abecedy, vytištěné celé: Base62 nemá za sebou žádný normalizační orgán, takže abeceda není zaručena napříč implementacemi. Toto jsou tři pořadí, která se skutečně objevují v praxi; každé je vytištěno znak po znaku s hodnotou, takže jakýkoli výsledek lze vysledovat zpět k přesné abecedě, která jej vytvořila. Zvýrazněná buňka je znak, který znamená nulu, a není to ve všech třech stejný znak.
Base62 rozlišuje velikost písmen v každém ze tří pořadí: velké písmeno a jeho malá verze téměř vždy znamenají jiné hodnoty, takže kód, který prošel krokem převodu na malá písmena, je jiné číslo, nikoli chyba.
Base62 rozlišuje velikost písmen v každém ze tří pořadí: velké písmeno a jeho malá verze téměř vždy znamenají jiné hodnoty, takže kód, který prošel krokem převodu na malá písmena, je jiné číslo, nikoli chyba.
Délka týchž bajtů v každém kódování:
Jak velký vstup tato stránka přijímá a proč: každý režim zde převádí přes jedno velké číslo a převod velkého čísla stojí čas úměrný druhé mocnině délky. To je vlastnost samotného formátu, ne této stránky: každý nástroj, který implementuje skutečný Base62, má stejný tvar limitu. Čísla níže pocházejí z časového měřicího nástroje, který spouští vlastní rutiny stránky, a ne z běžící karty, proto jsou záměrně na pesimistické straně: stolní prohlížeč obvykle skončí několikanásobně rychleji a tato rezerva kryje pomalý telefon. Limity jsou nastaveny tak, aby i pomalý případ skončil, místo aby zamrzl kartu.
Nad měkkým limitem první kliknutí vysvětlí náklady a před spuštěním požádá o druhé kliknutí; nad tvrdým limitem stránka odmítne, místo aby zamrzla kartu na několik sekund bez možnosti ukázat průběh. Bajtový režim se počítá v bajtech při kódování a v znacích při dekódování a počet znaků je vždy větší: 2 048 bajtů se vytiskne jako asi 2 751 znaků, což je nad limitem znaků, takže užitečné zatížení do asi 1 520 bajtů je to, co přežije obousměrný převod na této stránce. Pro prostá binární data libovolné skutečné velikosti jsou Base64 a Base91 lineární a takový limit nemají.
Co je Base62?

Base62 je způsob zápisu čísla pouze znaky, které přežijí vložení kamkoli: deset číslic, 26 velkých písmen a 26 malých písmen. Žádná interpunkce, žádné mezery, žádný výplňový znak, nic, co by se muselo escapovat, než se to dostane do URL, názvu souboru, cookie nebo klíče databáze. Deset plus 26 plus 26 je 62, odtud název.

Verze na 30 sekund: číslo 12345 se zapíše jako 3D7 a 1234567890 jako 1LY7VK. Zpět je to stejná operace obráceně a potřebuje přesnou abecedu, která kód vytvořila — jiná abeceda tých šest znaků přeloží na jiné číslo, bez jakékoli chybové hlášky.

Tato stránka dělá dvě příbuzné věci a rozdíl mezi nimi je důležitější než cokoli jiného na této stránce:

  • Integerový režim bere vstup jako číslo. Desítkový identifikátor jako 1234567890 se stane 1LY7VK a úvodní nuly vstupu nejsou součástí hodnoty, takže se nevrátí.
  • Bajtový režim bere vstup jako řetězec bajtů. Bajty se přečtou jako jedno obrovské číslo big-endian a pak se dělí 62, což je stejná aritmetika nad jinou veličinou. Zde počet úvodních nulových bajtů přežije, jeden nulový bajt za jeden nulový znak.
Odkud se bere 62 a co to stojí

62 není mocnina dvou a tato jediná skutečnost určuje všechno ostatní. Známá kódování vznikají tak, že se vstup rozřeže na pevné skupiny bitů: 4 bity se vytisknou jako jeden hexadecimální znak, 6 bitů jako jeden znak Base64, 5 bitů jako jeden znak Base32. Base62 to nedokáže, protože žádný celý počet bitů se nevejde do znaku o 62 hodnotách — 5 bitů pojmenuje jen 32 hodnot, 6 bitů 64. Base62 proto jde přes aritmetiku: přečte celý vstup jako jedno celé číslo a vytiskne je o základu 62.

Jeden znak pak nese log2(62) = 5,954 bitu, což je velmi blízko 6 bitům Base64, a v desítkovém režimu jeden znak nahrazuje log62(10) = 1,792 desítkové číslice. Před výběrem délky stojí za zapamatování několik důsledků:

Délka kóduHodnoty, které dokáže pojmenovatV praxi
4 znaky624 = 14 776 336Dost pro čítač, který zůstane pod osmi číslicemi, a vejde se do prostoru jednoho telefonního čísla.
6 znaků626 = 56 800 235 584Obvyklý tvar identifikačního kódu. Desetimístný desítkový identifikátor se vejde do šesti znaků.
7 znaků627 = 3 521 614 606 208Za rozsahem 32bitového čítače o dva řády, v šířce krátkého odkazu.
11 znaků6211 = 52 036 560 683 837 093 888Více než 264 = 18 446 744 073 709 551 616, takže celé 64bitové číslo se vejde do jedenácti znaků.

Obráceně: 1 000 desítkových číslic potřebuje asi 558 znaků a 4 096 desítkových číslic potřebuje 2 285. Úspora je skutečná, ale omezená: Base62 zkrátí desítkové číslo zhruba o 44% a nikdy nepřekoná nejhustší tisknutelná kódování, protože 5,954 bitu na znak je prostě méně než 6,4 nebo 6,5.

Integerový režim: co se děje s úvodními nulami

Celé číslo má jediný kanonický zápis a začíná nulovým znakem abecedy, což je 0 ve dvou pořadích s číslicemi napřed a A v pořadí s písmeny napřed. Všechno vlevo od prvního významného znaku je výplň a výplň není součástí hodnoty: 00012345 i 12345 se oba stanou 3D7. Je-li požadována pevná šířka — například sedmiznakový kód, který se musí zarovnat do sloupce — políčko stránky Doplnit výsledek na pevnou šířku opakuje nulové znaky, dokud se nedosáhne šířky, takže 12345 při šířce 7 vytiskne 00003D7 v abecedě s číslicemi napřed a AAAADNH v té s písmeny napřed. Výplň je kosmetická: úvodní znaky k hodnotě nic nepřidávají, protože 0 × 626 i 0 × 625 jsou nula, ať nulu zapíše jakýkoli znak.

Dekódování řetězce s výplní proto také funguje a stránka hlásí, kolik úvodních znaků bylo nulových, aby rozdíl mezi „kód má sedm znaků“ a „hodnota potřebovala tři znaky“ nebyl nikdy záhadou.

Bajtový režim: stejná aritmetika nad řetězcem bajtů

Bajtový režim přečte vstupní bajty jako jedno velké číslo big-endian — celý řetězec bajtů se bere jako jedno číslo, ať je jakkoli dlouhý — a vytiskne je o základu 62. Protože bajt obsahuje 8 bitů a znak jich nese 5,954, bajtový režim není komprese: potřebuje asi 134% velikosti vstupu, mírně hůř než 133% u Base64. U vzorku o 92 bajtech použitém v tabulce velikostí se 92 bajtů vytiskne jako 124 znaků Base62 a Base64 také jako 124 (123 z nich před výplní =). Base62 prohrává s Base64 v hustotě a vyhrává v bezpečnosti znaků, což je kompromis, který každý krátký odkaz a kód pozvánky dělá záměrně.

Úvodní nulové bajty se zachovávají a dá se to pokazit v obou směrech. Dva úvodní nulové bajty následované 0x01 se vytisknou jako 001 v abecedě s číslicemi napřed a jako AAB v té s písmeny napřed, protože úvodní znaky zapisují nulu, jeden na každý nulový bajt. Řetězec bajtů tvořený jediným 0x00 se vytiskne jako jediný znak 0 a jediný bajt 0x01 jako 1. Je to jediné místo, kde se bajtový a integerový režim liší, přestože běží stejný algoritmus.

Cenou za to je, že bajtový režim zdědí kvadratickou časovou složitost aritmetiky: 1 024 bajtů se odhaduje na asi třetinu sekundy a 2 048 bajtů na asi 1,3 sekundy, to jsou stejná čísla jako v tabulce limitů výše. Proto je bajtový režim zde omezen na 2 048 bajtů při odeslání a na 2 048 znaků při návratu — 2 048 bajtů se vytiskne jako asi 2 751 znaků, takže největší užitečné zatížení, které přežije obousměrný převod na této stránce, je asi 1 520 bajtů. Bajtový režim na této stránce je proto referenční pomůckou pro malé hodnoty, nikoli náhradou za Base64 nebo Base91 pro skutečné soubory.

Tři abecedy a proč je abeceda celým příběhem

Znaky abecedy tvoří pevnou posloupnost a hodnota znaku je jeho pozice v této posloupnosti. Přesun posloupnosti mění význam každého znaku. Tři pořadí jsou v širokém používání a toto je stejné číslo zapsané v každém z nich:

Desítkově0-9 pak A-Z pak a-z0-9 pak a-z pak A-ZA-Z pak a-z pak 0-9
000A
61zZ9
621010BA
12 3453D73d7DNH
1 234 567 8901LY7VK1ly7vkBViHfU

Čtěte poslední tři sloupce jako jednu abecedu a je to jeden soudržný systém. Čtěte je jako zaměnitelné a rozpadne se to, protože dekódování je vůči abecedě slepé nejhorším možným způsobem: každý znak vstupu je ve všech třech abecedách, takže špatná abeceda nevyvolá žádnou chybu, jen jiné číslo.

KódČteno jako 0-9 A-Z a-zČteno jako 0-9 a-z A-ZČteno jako A-Z a-z 0-9
3D712 34513 957211 665
1LY7VK1 234 567 8901 624 950 79248 723 527 772

Velikost písmen je druhá, ostřejší verze téže pasti. Base62 rozlišuje velikost písmen v každém pořadí, takže převod kódu na malá písmena jej tiše přepíše: 1LY7VK je 1 234 567 890 v abecedě s číslicemi napřed, zatímco 1ly7vk je ve stejné abecedě 1 624 950 792 — a v abecedě číslice–malá–velká je to 1 234 567 890, protože toto pořadí je přesně abeceda s číslicemi napřed s prohozenými velikostmi písmen. Ani nulový znak není společný: obě pořadí s číslicemi napřed zapisují nulu jako 0, zatímco pořadí s písmeny napřed ji zapisuje jako A, takže tato abeceda vůbec nezačíná číslicí.

Base62 vedle ostatních kódování
KódováníBitů na znakVelikost oproti vstupuPoznámky
Base16 (hex)4200%Dva znaky na bajt, triviálně čitelné, žádná abeceda k vyhledání.
Base325160%Nerozlišuje velikost písmen a je bezpečná pro diktování, nejplýtvavější z této skupiny.
Base36 (0-9 a-z)~5,17~155%Jen číslice a malá písmena, takže přežije převod na malá písmena. 12345 je 9ix.
Base58~5,86~137%Zvolena pro adresy, ne pro hustotu: čtyři zaměnitelné znaky se vynechají místo toho, aby se seřadily. Viz Base32 / Base58.
Base62~5,95~134%Každý znak je číslice nebo písmeno, takže se nikdy nic neescapuje. Hustota je mezi Base58 a Base64.
Base646133%Všude výchozí, za cenu znaků +, / a =, které vynucují escapování. Viz Převodník Base64.
Ascii85 / Base856,4125%5 znaků na 4 bajty, ale dělí se 85 a jeho abeceda vyžaduje uvozovky. Viz Ascii85.
Base91~6,5~123%Nejhustší z nich a ten, jehož výstup je nejméně bezpečné vložit bez escapování. Viz Base91.

Procenta jsou zaokrouhlené asymptotické náklady; naměřené počty znaků pro jeden skutečný vstup o 92 bajtech jsou v tabulce velikostí výše na této stránce. V integerovém režimu srovnání běží obráceně, protože vstup je desítkový text, nikoli bajty: tam je Base62 asi o 44% kratší než číslice, které nahrazuje, a Base36 asi o 36% kratší, proto se identifikační kódy obvykle píší v Base62 nebo Base36, a ne v Base58.

Čím Base62 není
  • Není to norma. Neexistuje žádné RFC ani specifikace. Žádný normalizační orgán Base62 nikdy nedefinoval, proto není zaručena abeceda a proto tato stránka vypisuje všechna tři pořadí, místo aby tiše vybrala jedno.
  • Není to šifrování. Je to změna základu, nic víc. Kdo zná abecedu, obrátí ji v jednom průchodu; není zde žádný klíč, žádná sůl a žádné tajemství.
  • Není to komprese. Bajtový režim data zvětší zhruba o třetinu. Integerový režim jen vypadá jako komprese, protože desítkový text je sám o sobě neefektivní způsob zápisu čísla.
  • Nerozlišuje velikost písmen. Base32 lze převést na malá písmena a přečíst zpět; Base62 nelze. Kód, který projde systémem normalizujícím velikost písmen, je poškozený kód.
  • Neobsahuje kontrolu. Nemá kontrolní součet ani kontrolní znak, takže jeden špatný znak dá platně vypadající výsledek s jinou hodnotou. Pokud na tom záleží, pořadí Bitcoinu má kontrolní součet — viz oddíl Base58Check v Base32 / Base58.
  • Nemá pevnou délku. Počet znaků roste s hodnotou, takže čítač, který začíná na 1 a dojde k 627, přejde z jednoho znaku na osm. Když je potřeba stabilní sloupec, doplňte na pevnou šířku.
Pasti, které opravdu kousnou
  • Abeceda odpovídá na devět z deseti záhad. Pokud jiný nástroj dá pro stejné číslo jiný kód, před podezřením na chybu porovnejte obě abecedy znak po znaku. Tabulka výše ukazuje tutéž hodnotu ve třech abecedách a všechny tři jsou správné.
  • Špatná abeceda selhává tiše. Pro ni neexistuje chybová cesta: 3D7 se dekóduje na 12 345, 13 957 nebo 211 665 podle toho, které pořadí se předpokládá. Zkontrolujte první znak, který je nejpravděpodobněji nulová výplň, a zda abeceda začíná číslicemi, nebo písmeny.
  • Úvodní nuly znamenají dvě různé věci. V integerovém režimu jsou 00012345 a 12345 stejné číslo a vytisknou se stejně. V bajtovém režimu je úvodní nulový bajt data a vytiskne se jako jeden navíc nulový znak. Vynechání jednoho z těchto znaků změní řetězec bajtů.
  • Normalizace velikosti písmen kód zničí. E-mailová adresa, název hostitele nebo cesta ve Windows mohou být při přenosu převedeny na malá písmena. Kód Base62 to nepřežije, a proto Base36 stále existuje.
  • Dlouhé vstupy jsou pomalé, nejen velké. Převod je aritmetika nad celým vstupem najednou, takže zdvojnásobení délky vstupu čtyřnásobí čas. Tato stránka odmítá vstupy za svými naměřenými limity místo toho, aby zamrzla; tabulka velikostí výše uvádí naměřená čísla.
  • Řetězec Base62 nic nedokazuje. Protože téměř každý řetězec číslic a písmen se dekóduje bez stížností, libovolný slug URL se dekóduje na nějaké číslo. Kód má smysl jen tehdy, když systém, který jej vydal, ukládá i mapování.
Rychlé odpovědi

“Proč jiný nástroj Base62 dá pro stejné číslo jiný kód?”

Protože se abeceda liší. Base62 nemá specifikaci, s níž by se dalo nesouhlasit, takže implementace volí pořadí: číslice a velká písmena napřed, číslice a malá písmena napřed, nebo písmena před číslicemi. Přepněte výběr abecedy nahoře na této stránce a uvidíte všechny tři odpovědi vedle sebe.

“Je Base62 bezpečné v URL?”

Ano, u všech tří pořadí. Všech 62 znaků jsou neescapované písmeno nebo číslice, takže žádný z nich není v dotazovacím řetězci rozvinut na procentuální trojici a žádný neukončuje URL, segment cesty ani atribut HTML. To je celý důvod, proč jsou krátké odkazy v Base62 a ne v Base64.

“Který je menší, Base62 nebo Base64?”

Pro bajty je Base64 o chlup menší: asi 133% vstupu oproti asi 134%. U vzorku o 92 bajtech výše se oba shodují na 124 znacích. U desítkových čísel zkrátí Base62 text o asi 44%, a tam leží praktický zisk.

“Mohu tímto nástrojem dekódovat řetězec Base64?”

Ne, a nedá vám vědět, že selhal. Obě abecedy se ve všech 62 znacích překrývají, takže řetězec Base64 bývá zde také „platný“ vstup a jednoduše se dekóduje na jiné číslo. Pro Base64 používejte Base64.

“Má kód Base62 maximální délku?”

Ne, v teorii algoritmus nemá horní mez. V praxi se tato stránka zastaví u 4 096 desítkových číslic nebo 2 048 bajtů, protože aritmetika za ní je kvadratická a karta by zamrzla bez čehokoli na obrazovce, co by to vysvětlilo. Tabulka limitů výše uvádí naměřená čísla.

“Jak poznám, že výsledek na této stránce je správný?”

Stiskněte Autotest. Spustí všechny zdokumentované ukázky, každou délku bajtů od 0 do 64 a rozptyl desítkových čísel přes všechna tři pořadí, porovná vrácené hodnoty s tím, co vstoupilo, a znovu ověří, že všech 62 znaků každé abecedy je bezpečných v URL. Tlačítko Ukázka navíc porovná své tři výsledky s hodnotami zaznamenanými v datovém souboru této stránky, které byly ověřeny proti druhé nezávislé implementaci velkých čísel uložené v testovacích nástrojích webu.

Normy a uznání

Není zde žádný standard k implementaci: Base62 je konvence, ne specifikace, a tři abecedy vytištěné výše se objevují v reálném softwaru. Tato stránka ji implementuje pomocí vlastních rutin pro velká čísla webu, napsaných jako prostá aritmetika nad poli číslic, takže žádná velikost nikdy není omezena číselným typem JavaScriptu.

Texty stránky byly napsány pro tyto stránky. Každý pracovní příklad na této stránce vytvořil vlastní kód stránky a poté byl ověřen proti druhé, nezávislé implementaci s nativními velkými čísly, která je uložena v testovacích nástrojích této stránky; tatáž implementace ověřila tabulky ukázek a velikostí v datovém souboru.