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文字で数値を表現したい場合は時々出てくるので、その時にきっちり検証しておこう。