Mitä Base62 on?
Base62 on tapa kirjoittaa luku merkeillä, jotka säilyvät mihin tahansa liitettäessä: kymmenen numeroa, 26 isoa kirjainta ja 26 pientä kirjainta. Ei välimerkkejä, ei välilyöntejä, ei täytemerkkiä, ei mitään, mikä pitäisi escapoida ennen kuin se menee URL-osoitteeseen, tiedostonimeen, evästeeseen tai tietokannan avaimeen. Kymmenen plus 26 plus 26 on 62, ja siitä nimi tulee.
30 sekunnin versio: luku 12345 kirjoitetaan muodossa 3D7, ja 1234567890 kirjoitetaan muodossa 1LY7VK. Takaisinpäin meno on sama operaatio käänteisesti, ja se tarvitsee täsmälleen aakkoston, joka tuotti koodin — eri aakkosto muuttaa samat kuusi merkkiä toiseksi luvuksi ilman virheilmoitusta.
Tällä sivulla on kaksi toisiinsa liittyvää tehtävää, ja niiden ero on tärkeämpi kuin mikään muu sivulla:
- Kokonaislukutila käsittelee syötteen lukuna. Desimaalitunniste kuten
1234567890 muuttuu muotoon 1LY7VK, eikä syötteen johtavia nollia kuulu arvoon, joten ne eivät palaa takaisin.
- Tavutila käsittelee syötteen tavujonona. Tavut luetaan yhdeksi valtavaksi big-endian-kokonaisluvuksi ja jaetaan sitten 62:lla, eli sama laskutoimitus eri suureelle. Täällä johtavien nollatavujen määrä säilyy, yksi nollatavu per nollamerkki.
Mistä 62 tulee ja mitä se maksaa
62 ei ole kahden potenssi, ja tämä yksi tosiasia muokkaa kaikkea muuta. Tutut koodaukset rakennetaan leikkaamalla syöte kiinteisiin bittiryhmiin: 4 bittiä tulostuu yhdeksi heksamerkiksi, 6 bittiä yhdeksi Base64-merkiksi, 5 bittiä yhdeksi Base32-merkiksi. Base62 ei pysty siihen, koska mikään kokonaislukumäärä bittejä ei sovi 62 arvon merkkiin — 5 bittiä nimeää vain 32 arvoa, 6 bittiä 64. Siksi Base62 kulkee aritmetiikan kautta: luetaan koko syöte yhdeksi kokonaisluvuksi ja tulostetaan se kantaluvussa 62.
Yksi merkki kantaa silloin log2(62) = 5,954 bittiä, mikä on hyvin lähellä Base64:n 6 bittiä, ja desimaalitilassa yksi merkki korvaa log62(10) = 1,792 desimaalinumeroa. Muutama seuraus, joka kannattaa tietää ennen pituuden valintaa:
| Koodin pituus | Arvot, jotka se voi nimetä | Käytännössä |
| 4 merkkiä | 624 = 14 776 336 | Riittää laskurille, joka pysyy alle kahdeksassa numerossa, ja mahtuu puhelinnumeron verran tilaa. |
| 6 merkkiä | 626 = 56 800 235 584 | Tunnuskoodin tavallinen muoto. Kymmenen numeron desimaalitunniste mahtuu kuuteen merkkiin. |
| 7 merkkiä | 627 = 3 521 614 606 208 | 32 bitin laskurin alueen yli kaksi kertaluokkaa, lyhyen linkin tunnisteen leveydessä. |
| 11 merkkiä | 6211 = 52 036 560 683 837 093 888 | Enemmän kuin 264 = 18 446 744 073 709 551 616, joten täysi 64 bitin luku mahtuu yhdeksääntoista merkkiin. |
Toiseen suuntaan: 1 000 desimaalinumeroa tarvitsee noin 558 merkkiä ja 4 096 desimaalinumeroa 2 285 merkkiä. Säästö on todellinen mutta rajattu: Base62 lyhentää desimaalilukua noin 44%, eikä se koskaan voita tiheimpiä tulostettavia koodauksia, koska 5,954 bittiä merkkiä kohden on yksinkertaisesti vähemmän kuin 6,4 tai 6,5.
Kokonaislukutila: mitä johtaville nollille tapahtuu
Kokonaisluvulla on yksi kanoninen kirjoitusmuoto, ja se alkaa aakkoston nollamerkillä, joka on 0 kahdessa numerot-ensin-järjestyksessä ja A kirjaimet-ensin-järjestyksessä. Ensimmäisen merkittävän merkin vasemmalla puolella oleva kaikki on täytettä, eikä täyte kuulu arvoon: 00012345 ja 12345 muuttuvat molemmat muotoon 3D7. Jos halutaan kiinteä leveys — esimerkiksi seitsemän merkin koodi, joka pitää linjata sarakkeeseen — sivun kenttä Täytä tulos kiinteään leveyteen toistaa nollamerkkejä, kunnes leveys saavutetaan, joten 12345 leveydellä 7 tulostuu 00003D7na numerot-ensin-aakkostossa ja AAAADNHna kirjaimet-ensin-aakkostossa. Täyte on kosmeettista: johtavat merkit eivät lisää arvoon mitään, ja kummankin merkkijonon dekoodaus palauttaa 12345, koska 0 × 626 ja 0 × 625 ovat molemmat nollia riippumatta siitä, mikä merkki nollan kirjoittaa.
Täytetyn merkkijonon dekoodaus toimii siis myös, ja sivu kertoo, kuinka monta johtavaa merkkiä oli nollamerkkejä, jotta ero “koodi on seitsemän merkkiä” ja “arvo tarvitsi kolme merkkiä” ei jää arvoitukseksi.
Tavutila: sama laskutoimitus tavujonolle
Tavutila lukee syötteen tavut yhdeksi big-endian-kokonaisluvuksi — koko tavujono käsitellään yhtenä lukuna, olipa se kuinka pitkä tahansa — ja tulostaa luvun kantaluvussa 62. Koska tavussa on 8 bittiä ja merkki nimeää niistä 5,954, tavutila ei ole pakkausta: se tarvitsee noin 134% syötteen koosta, hieman huonommin kuin Base64:n 133%. Kokotaulukon 92 tavun näytteessä 92 tavua tulostuu 124 Base62-merkiksi, ja Base64 tulostaa myös 124 (joista 123 ennen =-täytettä). Base62 häviää Base64:lle tiheydessä ja voittaa merkkien turvallisuudessa — kompromissi, jonka jokainen lyhyt linkki ja kutsukoodi tekee tarkoituksella.
Johtavat nollatavut säilyvät, ja tämä on helppo tehdä väärin kumpaankin suuntaan. Kaksi johtavaa nollatavua ja sen perässä 0x01 tulostuu muodossa 001 numerot-ensin-aakkostossa ja muodossa AAB kirjaimet-ensin-aakkostossa, koska johtavat merkit kirjoittavat nollaa, yksi per nollatavu. Yksittäinen 0x00 tulostuu yhtenä merkkinä 0, ja yksittäinen 0x01 merkkinä 1. Tämä on ainoa kohta, jossa tavutila ja kokonaislukutila näyttävät erilaisilta, vaikka ne ajavat samaa algoritmia.
Tämän hinta on se, että tavutila perii laskutoimituksen neliöllisen ajoituksen: 1 024 tavua arvioidaan noin kolmasosaan sekuntiin ja 2 048 tavua noin 1,3 sekuntiin, samat luvut kuin rajataulukossa yllä. Siksi tavutila on täällä rajattu 2 048 tavuun lähtevänä ja 2 048 merkkiin palaavana — 2 048 tavua tulostuu noin 2 751 merkiksi, joten noin 1 520 tavua on suurin hyötykuorma, joka selviää kierroksesta tämän sivun läpi — ja siksi tämän sivun tavutila on viite pienille arvoille, ei korvike Base64:lle tai Base91:lle oikeille tiedostoille.
Kolme aakkostoa, ja miksi aakkosto on koko tarina
Aakkoston merkit ovat kiinteä jono, ja merkin arvo on sen paikka tässä jonossa. Jonon siirtäminen muuttaa jokaisen merkin merkitystä. Kolme järjestystä on laajalti käytössä, ja alla sama luku kirjoitettuna kolmella tavalla:
| Desimaali | 0-9 sitten A-Z sitten a-z | 0-9 sitten a-z sitten A-Z | A-Z sitten a-z sitten 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 |
Lue kolme viimeistä saraketta yhtenä aakkostona, ja se on yhtenäinen järjestelmä. Lue ne toisiinsa vaihdettavina, ja se hajoaa, koska dekoodaus on pahimmalla mahdollisella tavalla aakkostosokea: jokainen syötteen merkki on kaikissa kolmessa aakkostossa, joten väärä aakkosto ei tuota virhettä lainkaan, vain erilaisen luvun.
| Koodi | Luettuna 0-9 A-Z a-z | Luettuna 0-9 a-z A-Z | Luettuna 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 |
Kirjainkoko on toinen, terävämpi versio samasta sudenkuopasta. Base62 on kirjainkokoherkkä kaikissa järjestyksissä, joten koodin pienentäminen kirjoittaa sen hiljaa uudelleen: 1LY7VK on 1 234 567 890 numerot ensin -aakkostossa, kun taas 1ly7vk on samassa aakkostossa 1 624 950 792 — ja se on 1 234 567 890 numerot-pienet-isot-aakkostossa, koska tuo järjestys on täsmälleen numerot-ensin-järjestys kirjainkokojen vaihdettuna. Nollamerkki ei ole yhteinen myöskään: kaksi numerot-ensin-järjestystä kirjoittavat nollan merkiksi 0, kun taas kirjaimet-ensin-järjestys kirjoittaa sen merkiksi A, joten se aakkosto ei ala numerolla lainkaan.
Base62 muiden koodausten rinnalla
| Koodaus | Bittejä merkkiä kohden | Koko suhteessa syötteeseen | Huomautukset |
| Base16 (heksa) | 4 | 200% | Kaksi merkkiä tavua kohden, helppolukuinen, ei aakkostoa katsottavaksi. |
| Base32 | 5 | 160% | Kirjainkoosta riippumaton ja turvallinen sanelulle, ryhmän hukkaavin. |
| Base36 (0-9 a-z) | ~5,17 | ~155% | Vain numerot ja pienet kirjaimet, joten se selviää kirjainkoon muutoksesta. 12345 on 9ix. |
| Base58 | ~5,86 | ~137% | Valittu osoitteisiin, ei tiheyteen: neljä sekoitettavaa merkkiä on pudotettu pois. Katso Base32 / Base58. |
| Base62 | ~5,95 | ~134% | Jokainen merkki on numero tai kirjain, joten mitään ei koskaan escapoida. Tiheys on Base58:n ja Base64:n välissä. |
| Base64 | 6 | 133% | Oletus kaikkialla, hintana +, / ja =, kolme merkkiä, jotka pakottavat escapoinnin. Katso Base64-muunnin. |
| Ascii85 / Base85 | 6,4 | 125% | 5 merkkiä 4 tavua kohden, mutta se jakaa 85:llä ja sen aakkosto vaatii lainausmerkit. Katso Ascii85. |
| Base91 | ~6,5 | ~123% | Näistä tihein ja se, jonka tulos on vähiten turvallista liittää escapoimatta. Katso Base91. |
Prosentit ovat asymptoottisia kustannuksia, pyöristettyinä; todelliset merkkimäärät yhdelle oikealle 92 tavun syötteelle ovat tämän sivun kokotaulukossa edempänä. Kokonaislukutilassa vertailu on päinvastainen, koska syöte on desimaalitekstiä eikä tavuja: siellä Base62 on noin 44% lyhyempi kuin numerot, jotka se korvaa, ja Base36 noin 36% lyhyempi, minkä vuoksi tunnistekoodi on tavallisesti Base62 tai Base36 eikä Base58.
Mitä Base62 ei ole
- Ei standardi. Ei ole RFC:tä eikä spesifikaatiota. Mikään standardointielin ei ole koskaan määritellyt Base62:ta, minkä vuoksi aakkostoa ei ole taattu ja minkä vuoksi tämä sivu tulostaa kaikki kolme järjestystä sen sijaan, että valitsisi yhden hiljaa.
- Ei salausta. Kyse on kantaluvun muutoksesta, ei muusta. Kuka tahansa, joka tuntee aakkoston, kääntää sen yhdellä kierroksella, eikä siinä ole avainta, suolaa tai minkäänlaista salaisuutta.
- Ei pakkausta. Tavutila kasvattaa dataa noin kolmanneksen. Kokonaislukutila näyttää pakkaukselta vain siksi, että desimaalitekstiä on tehoton tapa kirjoittaa luku alun perinkään.
- Ei kirjainkoosta riippumaton. Base32:n voi kirjoittaa pienillä kirjaimilla ja lukea takaisin; Base62 ei onnistu. Koodi, joka kulkee järjestelmän kautta, joka normalisoi kirjainkokoa, on vioittunut koodi.
- Ei itsetarkistava. Tarkistussummaa tai tarkistusmerkkiä ei ole, joten yksi väärä merkki antaa uskottavan näköisen tuloksen eri arvolla. Jos sillä on väliä, Bitcoin-järjestys tulee tarkistussumman kanssa — katso Base58Check-osio sivulla Base32 / Base58.
- Ei kiinteä pituus. Merkkien määrä kasvaa arvon mukana, joten laskuri, joka alkaa luvusta 1 ja saavuttaa 627, menee yhdestä merkistä kahdeksaan. Täytä kiinteään leveyteen, kun tarvitaan vakaa sarake.
Todelliset sudenkuopat
- Aakkosto on vastaus yhdeksään kymmenestä arvoituksesta. Jos toinen työkalu antaa eri koodin samalle luvulle, vertaa kahta aakkostoa merkki merkiltä ennen kuin epäilet virhettä. Yllä oleva taulukko näyttää saman arvon kolmessa aakkostossa, ja kaikki kolme ovat oikein.
- Väärä aakkosto epäonnistuu hiljaa. Sille ei ole virheen polkua:
3D7 dekoodautuu arvoksi 12 345, 13 957 tai 211 665 pelkästään sen mukaan, mikä järjestys oletetaan. Tarkista ensimmäinen merkki, joka on todennäköisimmin nollatäyte, ja tarkista, onko aakkostossa numerot vai kirjaimet edessä.
- Johtavilla nollilla on kaksi eri merkitystä. Kokonaislukutilassa
00012345 ja 12345 ovat sama luku ja tulostuvat samoin. Tavutilassa johtava nollatavu on dataa, ja se tulostuu yhtenä ylimääräisenä nollamerkkinä. Yhden näistä merkeistä pudottaminen muuttaa tavujonoa.
- Kirjainkoon normalisointi tuhoaa koodin. Sähköpostiosoite, isäntänimi tai Windowsin polku voidaan muuttaa pieniksi kirjaimiksi siirron aikana. Base62-koodi ei selviä siitä, ja siksi Base36 on yhä olemassa.
- Pitkät syötteet ovat hitaita, eivät vain suuria. Muunnos on aritmetiikkaa koko syötteelle kerralla, joten syötteen pituuden kaksinkertaistaminen nelinkertaistaa ajan. Tämä sivu kieltäytyy syötteistä mitattujen rajojen yli sen sijaan, että jumittuisi; kokotaulukko edempänä antaa mitatut luvut.
- Base62-merkkijono ei todista mitään. Koska melkein mikä tahansa numeroiden ja kirjainten merkkijono dekoodautuu ilman valitusta, mielivaltainen URL-tunnus dekoodautuu johonkin lukuun. Koodilla on merkitystä vain, jos sen myöntävä järjestelmä tallentaa myös vastaavuuden.
Pikavastaukset
“Miksi toinen Base62-työkalu antaa saman luvun eri koodin?”
Koska aakkosto on erilainen. Base62:lla ei ole spesifikaatiota, jonka kanssa olla eri mieltä, joten toteutukset valitsevat järjestyksen: numerot ja isot kirjaimet ensin, numerot ja pienet kirjaimet ensin tai kirjaimet ennen numeroita. Vaihda tämän sivun yläosan aakkostovalinta nähdäkseen kaikki kolme vastausta vierekkäin.
“Onko Base62 turvallinen URL-osoitteessa?”
Kyllä, kaikissa kolmessa järjestyksessä. Kaikki 62 merkkiä ovat escapoimattomia kirjaimia ja numeroita, joten yksikään niistä ei laajennu prosenttikolmikoksi kyselymerkkijonossa, eikä yksikään lopeta URL-osoitetta, polun segmenttiä tai HTML-attribuuttia. Siksi lyhyet linkit ovat Base62:ta eikä Base64:ää.
“Kumpi on pienempi, Base62 vai Base64?”
Tavuille Base64 on hieman pienempi: noin 133% syötteestä verrattuna noin 134%:iin. Yllä olevassa 92 tavun näytteessä molemmat ovat tasan 124 merkkiä. Desimaaliluvuille Base62 lyhentää tekstiä noin 44%, ja siinä on käytännön hyöty.
“Voinko dekoodata Base64-merkkijonon tällä sivulla?”
Ei kumpikaan, eikä työkalu kerro, jos jokin menee pieleen. Kaksi aakkostoa menevät päällekkäin kaikissa 62 merkissä, joten Base64-merkkijono on yleensä “kelvollinen” syöte täälläkin ja dekoodautuu vain eri luvuksi. Käytä Base64:ää Base64:lle.
“Onko Base62-koodilla enimmäispituutta?”
Ei: teoriassa algoritmilla ei ole rajaa. Käytännössä tämä sivu pysähtyy 4 096 desimaalinumeroon tai 2 048 tavuun, koska sen takana oleva aritmetiikka on neliöllinen ja välilehti jäätyisi ilman mitään selitystä ruudulla. Tämän sivun rajataulukko listaa mitatut luvut.
“Miten tiedän, että tämän sivun tulos on oikein?”
Paina Itsetesti. Se ajaa jokaisen dokumentoidun näytteen, jokaisen tavupituuden 0-64 ja joukon desimaalilukuja kaikkien kolmen aakkoston läpi vertaamalla palautettuja arvoja syötettyihin ja tarkistaa uudelleen, että kunkin aakkoston 62 merkki ovat URL-turvallisia. Esimerkki-painike vertaa lisäksi kolmea tulostaan tämän sivun datatiedostoon tallennettuihin arvoihin, jotka tarkistettiin toisella, riippumattomalla suurten kokonaislukujen toteutuksella, joka on tallessa tämän sivuston testityökaluissa.
Standardit ja tekijyys
Tässä ei ole toteutettavaa standardia: Base62 on konventio, ei spesifikaatio, ja yllä tulostetut kolme aakkostoa ovat ne, jotka näkyvät oikeissa ohjelmistoissa. Tämä sivu toteuttaa sen sivuston omilla suurten kokonaislukujen rutiineilla, jotka on kirjoitettu tavallisena aritmetiikkana numerotaulukoilla, joten mikään koko ei ole rajoitettu JavaScript-lukutyypin mukaan.
Sivun teksti on kirjoitettu tälle sivustolle. Jokainen tällä sivulla työstetty esimerkki tuotettiin sivun omalla koodilla ja tarkistettiin sitten toisella, riippumattomalla toteutuksella, joka käyttää natiiveja suuria kokonaislukuja; se on tallessa tämän sivuston testityökaluissa. Sama toteutus vahvisti näytteet ja kokotaulukot datatiedostossa.