62進数

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)