Pythonで62進数を作ってみた。
なぜ62進数かって?
それは英数字全部合わせて62文字だから。
Base64とか+とか/とか入って嫌じゃないですかー。
さっそく書いてみた。
def _make_use_chars_base_62():
return [str(i) for i in xrange(0, 10)] + \
[chr(i) for i in xrange(ord('a'), ord('z')+1)] + \
[chr(i) for i in xrange(ord('A'), ord('Z')+1)]
def encode_base_62(decimal):
base_62_str = ''
use_chars = _make_use_chars_base_62()
while True:
base_62_str = use_chars[decimal % 62] + base_62_str
decimal -= decimal % 62
decimal /= 62
if decimal == 0:
break
return base_62_str
def decode_base_62(base_62_str):
decimal = 0
use_chars = _make_use_chars_base_62()
for c in base_62_str:
decimal *= 62
decimal += use_chars.index(c)
return decimal
もうちょっとキレイで速いコード書けそうだけど、まあいいや。時には妥協も必要さ。
encodeの方のループ抜ける所はdo-whileで書きたいけど、Pythonにはdo-whileないんだよね…
動かしてみよう。
>>> encode_base_62(0)
'0'
>>> encode_base_62(10)
'a'
>>> encode_base_62(36)
'A'
>>> encode_base_62(62)
'10'
>>> encode_base_62(124)
'20'
>>> encode_base_62(100000000)
'6LAze'
>>> decode_base_62('6LAze')
100000000
>>> decode_base_62('0')
0
なんとなく大丈夫そう。
本当はきっちりテストコード書くべきだけど、まあいいや。
62進数、というより英数字62文字で数値を表現したい場合は時々出てくるので、その時にきっちり検証しておこう。