Base62 nedir?
Base62, her yere yapıştırılınca bozulmayan karakterlerden başka bir şey kullanmadan bir sayı yazma yoludur: on rakam, 26 büyük harf ve 26 küçük harf. Noktalama işareti yok, boşluk yok, dolgu karakteri yok; bir URL'ye, bir dosya adına, bir çereze veya bir veritabanı anahtarına girmeden önce escape edilmesi gereken hiçbir şey yok. On artı 26 artı 26 eşittir 62 ve ad buradan gelir.
30 saniyelik sürüm: 12345 sayısı 3D7 olarak yazılır ve 1234567890 1LY7VK olarak yazılır. Geri yönde gitmek tersine aynı işlemdir ve kodu üreten tam alfabeyi gerektirir — farklı bir alfabe aynı altı karakteri, herhangi bir hata mesajı olmadan farklı bir sayıya çevirir.
Bu sayfa birbiriyle ilişkili iki iş yapar ve aralarındaki fark bu sayfadaki her şeyden daha önemlidir:
- Tamsayı modu girdiyi bir sayı olarak ele alır.
1234567890 gibi ondalık bir kimlik 1LY7VK olur ve girdinin önde gelen sıfırları değerin parçası değildir, bu yüzden geri gelmezler. - Bayt modu girdiyi bir bayt dizisi olarak ele alır. Baytlar tek bir devasa büyük-endian tamsayı olarak okunur ve sonra 62'ye bölünür; bu, farklı bir nicelik üzerinde aynı aritmetiktir. Burada önde gelen sıfır baytların sayısı korunur, her sıfır karakter için bir sıfır bayt.
62 nereden gelir ve neye mal olur
62 iki'nin kuvveti değildir ve bu tek gerçek her şeyi biçimlendirir. Tanıdık kodlamalar girdiyi sabit bit gruplarına bölerek kurulur: 4 bit bir onaltılık karaktere, 6 bit bir Base64 karakterine, 5 bit bir Base32 karakterine yazdırılır. Base62 bunu yapamaz, çünkü 62 değerli bir karaktere tam sayıda bit sığmaz — 5 bit yalnızca 32 değeri, 6 bit ise 64 değeri adlandırır. Bu yüzden Base62 aritmetik üzerinden gider: tüm girdiyi tek bir tamsayı olarak okuyun ve taban 62'de yazdırın.
Bir karakter bu durumda log2(62) = 5,954 bit taşır, bu da Base64'ün 6'sına çok yakındır; ondalık modda bir karakter log62(10) = 1,792 ondalık basamağın yerini alır. Bir uzunluk seçmeden önce bilinmesi gereken birkaç sonuç:
| Kod uzunluğu | Adlandırabileceği değerler | Pratikte |
| 4 karakter | 624 = 14.776.336 | Sekiz hanenin altında kalan bir sayaç için yeterli, bir telefon numarasının yerine sığar. |
| 6 karakter | 626 = 56.800.235.584 | Bir kimlik kodunun olağan biçimi. On haneli ondalık bir kimlik altı karaktere sığar. |
| 7 karakter | 627 = 3.521.614.606.208 | 32 bit bir sayacın aralığını iki büyüklük mertebesi aşar, kısa bir bağlantı slug'ının genişliğinde. |
| 11 karakter | 6211 = 52.036.560.683.837.093.888 | 264 = 18.446.744.073.709.551.616'dan fazla, bu yüzden tam bir 64 bitlik sayı on bir karaktere sığar. |
Tersinden düşünürsek, 1.000 ondalık basamak yaklaşık 558 karakter, 4.096 ondalık basamak 2.285 karakter gerektirir. Kazanç gerçektir ama sınırlıdır: Base62 bir ondalık sayıyı yaklaşık %44 kısaltır ve yoğun yazdırılabilir kodlamaları asla geçmez, çünkü karakter başına 5,954 bit, 6,4 veya 6,5'ten basitçe daha azdır.
Tamsayı modu: önde gelen sıfırlara ne olur
Bir tamsayının tek bir kanonik yazılı biçimi vardır ve alfabenin sıfır karakteriyle başlar: iki rakam-önce sıralamada 0, harf-önce sıralamada A. İlk anlamlı karakterin soluna düşen her şey dolgudur ve dolgu değerin parçası değildir: 00012345 ve 12345 ikisi de 3D7 olur. Sabit bir genişlik istendiğinde — örneğin bir sütunda hizalanması gereken yedi karakterlik bir kod — sayfanın Sonucu sabit genişliğe doldur kutusu genişliğe ulaşana kadar sıfır karakterleri tekrarlar, bu yüzden genişlik 7'de 12345 rakam-önce alfabesinde 00003D7 ve harf-önce alfabesinde AAAADNH yazdırır. Dolgu kozmetiktir: bu baştaki karakterler değere hiçbir şey katmaz ve her iki dizgiyi çözmek 12345'i geri verir, çünkü 0 × 626 ve 0 × 625 sıfırı hangi karakterin yazdığına bakmaksızın ikisi de sıfırdır.
Dolgulu bir dizgiyi çözmek bu yüzden de çalışır ve sayfa baştaki karakterlerin kaçının sıfır karakter olduğunu bildirir; böylece “kod yedi karakterdir” ile “değer üç karaktere ihtiyaç duydu” arasındaki fark asla bir gizem olmaz.
Bayt modu: bir bayt dizisinde aynı aritmetik
Bayt modu girdi baytlarını tek bir büyük-endian tamsayı olarak okur — uzunluğu ne olursa olsun tüm bayt dizisi tek bir sayı olarak ele alınır — ve bu sayıyı taban 62'de yazdırır. Bir bayt 8 bit içerdiğinden ve bir karakter bunların 5,954'ünü adlandırdığından, bayt modu sıkıştırma değildir: girdi boyutunun yaklaşık %134'üne ihtiyaç duyar, Base64'ün %133'ünden hafifçe kötü. Yukarıdaki boyut tablosunda kullanılan 92 baytlık örnekte, 92 bayt 124 Base62 karakteri olarak yazdırılır ve Base64 de 124 yazdırır (dolgu ='den önce 123'ü). Base62 yoğunlukta Base64'e yenilir, karakter güvenliğinde kazanır — her kısa bağlantının ve davet kodunun bilerek yaptığı takas budur.
Önde gelen sıfır baytlar korunur ve bu iki yönde de yanlış yapılması kolaydır. 0x01'den önce gelen iki sıfır bayt rakam-önce alfabesinde 001, harf-önce alfabesinde AAB olarak yazdırılır, çünkü baştaki karakterler sıfırı yazar ve her sıfır bayt için bir tane. Tek bir 0x00'dan oluşan bayt dizisi tek karakter 0 olarak yazdırılır ve tek bir 0x01 1 olarak yazdırılır. Bu, aynı algoritmayı çalıştırırken bayt modu ile tamsayı modunun farklı göründüğü tek yerdir.
Tüm bunun bedeli, bayt modunun aritmetiğin ikinci dereceden zamanlamasını devralmasıdır: 1.024 bayt yaklaşık üçte bir saniye, 2.048 bayt yaklaşık 1,3 saniye tahmin edilir; yukarıdaki sınırlar tablosunda aynı rakamlar verilmiştir. Bu yüzden buradaki bayt modu giderken 2.048 bayt, dönerken 2.048 karakterle sınırlıdır — 2.048 bayt yaklaşık 2.751 karakter olarak yazılır, bu yüzden bu sayfadan gidip dönen en büyük yük yaklaşık 1.520 bayttır — ve bu sayfadaki bayt modu gerçek dosyalar için Base64 veya Base91'in yerine değil, küçük değerler için bir referanstır.
Üç alfabe ve neden hikâyenin tamamı alfabedir
Bir alfabenin karakterleri sabit bir sıradır ve bir karakterin değeri o sıradaki konumudur. Sırayı yer değiştirmek her karakterin ne anlama geldiğini değiştirir. Üç sıralama yaygın olarak kullanılır ve bunların her birinde aynı sayı üç biçimde yazılır:
| Ondalık | 0-9 sonra A-Z sonra a-z | 0-9 sonra a-z sonra A-Z | A-Z sonra a-z sonra 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 |
Son üç sütunu tek bir alfabe olarak okuyun, tutarlı tek bir şema olur. Onları birbirinin yerine geçebilir olarak okuyursanız dağılır, çünkü çözme en kötü biçimde alfabeye kör çalışır: girdinin herhangi bir karakteri üç alfabede de bulunur, bu yüzden yanlış bir alfabe hiçbir hata üretmez, yalnızca farklı bir sayı üretir.
| Bir kod | 0-9 A-Z a-z olarak okunursa | 0-9 a-z A-Z olarak okunursa | A-Z a-z 0-9 olarak okunursa |
| 3D7 | 12.345 | 13.957 | 211.665 |
| 1LY7VK | 1.234.567.890 | 1.624.950.792 | 48.723.527.772 |
Büyük-küçük harf aynı tuzağın ikinci, daha keskin bir sürümüdür. Base62 her sıralamada büyük-küçük harfe duyarlıdır, bu yüzden bir kodu küçük harfe çevirmek onu sessizce yeniden yazar: 1LY7VK rakam-önce alfabesinde 1.234.567.890'dır, oysa 1ly7vk aynı alfabede 1.624.950.792'dir — ve rakamlar-sonra-küçük-harf alfabesinde tesadüfen 1.234.567.890'dır, çünkü bu sıralama tam olarak iki harf durumu değiştirilmiş rakam-önce sıralamasıdır. Sıfır karakteri de ortak değildir: iki rakam-önce sıralama sıfırı 0 yazar, harf-önce sıralama ise A yazar, bu yüzden o alfabe hiç rakamla başlamaz.
Base62, diğer kodlamalar yanında
| Kodlama | Karakter başına bit | Girdiye göre boyut | Notlar |
| Base16 (hex) | 4 | %200 | Bayt başına iki karakter, kolayca okunabilir, aranacak bir alfabe yok. |
| Base32 | 5 | %160 | Büyük-küçük harf duyarsız ve elle diktelenmeye güvenli; grubun en israfçısı. |
| Base36 (0-9 a-z) | ~5,17 | ~%155 | Yalnızca rakamlar ve küçük harfler, bu yüzden küçük harfe çeviren bir hattan sağ çıkar. 12345 9ix'tir. |
| Base58 | ~5,86 | ~%137 | Yoğunluk için değil adresler için seçildi: dört benzer karakter sıralanmak yerine çıkarıldı. Bkz. Base32 / Base58. |
| Base62 | ~5,95 | ~%134 | Her karakter bir rakam veya harftir, bu yüzden hiçbir şey asla escape edilmez. Yoğunluğu Base58 ile Base64 arasındadır. |
| Base64 | 6 | %133 | Her yerde varsayılan, bunun bedeli +, / ve =, yani escape'i zorunlu kılan üç karakter. Bkz. Base64 dönüştürücü. |
| Ascii85 / Base85 | 6,4 | %125 | 4 bayt başına 5 karakter, ama 85'e böler ve alfabesinin tırnaklanması gerekir. Bkz. Ascii85. |
| Base91 | ~6,5 | ~%123 | Bunların en yoğunu ve çıktısı escape edilmeden yapıştırılması en az güvenli olan. Bkz. Base91. |
Yüzdeler yuvarlanmış asimptotik maliyetlerdir; bir gerçek 92 baytlık girdi için ölçülen karakter sayıları bu sayfanın yukarısındaki boyut tablosundadır. Tamsayı modunda karşılaştırma tersine işler, çünkü girdi bayt değil ondalık metindir: orada Base62, yerini aldığı rakamlardan yaklaşık %44 kısadır ve Base36 yaklaşık %36 kısadır; bu yüzden bir kimlik kodu normalde Base58 değil Base62 veya Base36 olur.
Base62 olmayan şey
- Bir standart değil. RFC yok ve bir belirtim yok. Hiçbir standart kuruluşu Base62'yi hiçbir zaman tanımlamadı; bu yüzden alfabenin garantisi yoktur ve bu sayfa üç sıralamanın hepsini sessizce birini seçmek yerine yazdırır.
- Şifreleme değil. Bu yalnızca bir taban değişimidir. Alfabeyi bilen herkes tek geçişte tersine çevirir; hiçbir anahtar, tuz veya herhangi bir gizlilik yoktur.
- Sıkıştırma değil. Bayt modu veriyi yaklaşık üçte bir büyütür. Tamsayı modu yalnızca sıkıştırma gibi görünür, çünkü ondalık metin baştan bir sayıyı yazmanın verimsiz bir yoludur.
- Büyük-küçük harfe duyarsız değil. Base32 küçük harfe çevrilip geri okunabilir; Base62 okunamaz. Büyük-küçük harfi normalleştiren bir sistemden geçen bir kod bozulmuş bir koddur.
- Kendi kendini denetleyen değil. Bir sağlama toplamı ve denetim karakteri yoktur, bu yüzden tek bir yanlış karakter geçerli görünen ama farklı bir değer veren bir sonuç üretir. Bu önemliyse Bitcoin sıralaması bir sağlama toplamıyla gelir — Base32 / Base58 sayfasındaki Base58Check bölümüne bakın.
- Sabit uzunlukta değil. Karakter sayısı değerle birlikte büyür; bu yüzden 1'den başlayıp 627'ye ulaşan bir sayaç bir karakterden sekiz karaktere gider. Sabit bir sütun gerektiğinde sabit genişliğe doldurun.
Gerçekten ısıran tuzaklar
- Alfabe, on gizemin dokuzunun cevabıdır. Başka bir araç aynı sayı için farklı bir kod verirse, bir hatadan şüphelenmeden önce iki alfabeyi karakter karakter karşılaştırın. Yukarıdaki tablo aynı değeri üç alfabede gösterir ve üçü de doğrudur.
- Yanlış bir alfabe sessizce başarısız olur. Bunun için bir hata yolu yoktur:
3D7 hangi sıralamanın varsayıldığına bağlı olarak 12.345, 13.957 veya 211.665'e çözülür. İlk karaktere bakın, en olası sıfır dolgusudur ve alfabenin başında rakam mı harf mi olduğunu kontrol edin. - Önde gelen sıfırlar iki farklı şey anlamına gelir. Tamsayı modunda
00012345 ve 12345 aynı sayıdır ve aynı yazdırılır. Bayt modunda önde gelen sıfır bayt veridir ve bir ekstra sıfır karakter olarak yazdırılır. Bu karakterlerden birini düşürmek bayt dizisini değiştirir. - Büyük-küçük harf normalleştirmesi bir kodu yok eder. Bir e-posta adresi, bir ana bilgisayar adı veya bir Windows yolu taşıma sırasında küçük harfe çevrilebilir. Base62 kodu bunu atlatamaz, Base36'nın hâlâ var olmasının nedeni budur.
- Uzun girdiler yalnızca büyük değil, yavaştır. Dönüşüm tüm girdi üzerinde bir aritmetiktir, bu yüzden girdi uzunluğunu iki katına çıkarmak süreyi dört katına çıkarır. Bu sayfa takılmak yerine ölçülen sınırlarını aşan girdileri reddeder; bu sayfanın yukarısındaki boyut tablosu ölçülen sayıları verir.
- Bir Base62 dizgisi hiçbir şeyin kanıtı değildir. Hemen hemen her rakam ve harf dizgisi itiraz edilmeden çözüldüğü için rastgele bir URL slug'ı bir sayıya çözülür. Bir kod yalnızca onu veren sistem eşlemeyi de saklıyorsa bir anlam taşır.
Hızlı yanıtlar
“Neden başka bir Base62 aracı aynı sayı için farklı bir kod veriyor?”
Çünkü alfabe farklıdır. Base62'nin uyuşmak zorunda olduğu bir belirtim yoktur, bu yüzden uygulamalar bir sıralama seçer: önce rakamlar ve büyük harfler, önce rakamlar ve küçük harfler veya önce harfler ve rakamlar. Üç yanıtı yan yana görmek için bu sayfanın üstündeki alfabe seçimine geçin.
“Base62, bir URL içinde güvenli mi?”
Evet, üç sıralamanın hepsinde. 62 karakterin tamamı kaçırılmamış harf ve rakamdır, bu yüzden hiçbiri bir sorgu dizgisinde üçlü yüzde olarak genişletilmez ve hiçbiri bir URL'yi, bir yol segmentini veya bir HTML özniteliğini sonlandırmaz. Kısa bağlantıların Base64 değil Base62 olmasının tek nedeni budur.
“Base62 mi Base64 mi daha küçüktür?”
Baytlar için Base64 çok az daha küçüktür: girdinin yaklaşık %133'üne karşı yaklaşık %134. Yukarıdaki 92 baytlık örnekte ikisi 124 karakterle berabere kalır. Ondalık sayılar için Base62 metni yaklaşık %44 kısaltır ve pratik kazanç buradadır.
“Bu sayfayla bir Base64 dizgisini çözebilir miyim?”
Hayır ve başarısız olduğunu size söylemez. İki alfabe 62 karakterin tamamında örtüşür, bu yüzden bir Base64 dizgisi genellikle burada da “geçerli” girdidir ve yalnızca farklı bir sayıya çözülür. Base64 için Base64 kullanın.
“Bir Base62 kodunun bir azami uzunluğu var mı?”
Hayır, teorik olarak algoritmanın bir sınırı yoktur. Pratikte bu sayfa 4.096 ondalık basamakta veya 2.048 baytta durur, çünkü arkasındaki aritmetik ikinci dereceden çalışır ve sekme nedenini açıklayacak hiçbir şey ekranda olmadan donardı. Bu sayfanın yukarısındaki sınırlar tablosu ölçülen sayıları listeler.
“Bu sayfadaki sonucun doğru olduğunu nasıl bilebilirim?”
Kendi kendine test'e basın. Belgelenmiş her örneği, 0 ila 64 arasındaki her bayt uzunluğunu ve üç alfabenin hepsinde ondalık sayıların bir dağılımını çalıştırır, döndürülen değerleri girdiyle karşılaştırır ve her alfabenin 62 karakterinin bir URL'de güvenli olduğunu yeniden denetler. Örnek düğmesi ek olarak üç sonucunu, bu sayfanın veri dosyasında kaydedilmiş değerlerle karşılaştırır; bu değerler bu sitenin test araçlarında tutulan ikinci, bağımsız büyük tamsayı uygulamasıyla doğrulanmıştır.
Standartlar ve atıf
Burada uygulanacak bir standart yoktur: Base62 bir belirtim değil bir gelenektir ve yukarıda yazdırılan üç alfabe gerçek yazılımlarda görünenlerdir. Bu sayfa, hiçbir boyutun JavaScript sayı türüyle sınırlanmaması için sitenin kendi büyük tamsayı rutinlerini, basamak dizileri üzerinde düz aritmetikle yazılmış biçimde kullanır.
Bu sayfadaki metin bu site için yazılmıştır. Bu sayfadaki her çalışılmış örnek sayfanın kendi kodu tarafından üretilmiş ve ardından yerel büyük tamsayıları kullanan ikinci, bağımsız bir uygulamayla doğrulanmıştır; bu uygulama bu sitenin test araçlarında tutulur. Aynı uygulama veri dosyasındaki örnek ve boyut tablolarını da doğrulamıştır.