UUID(128bit)を可逆短縮する手法

重複することのないIDを生成したいときに何かと便利なUUID。

しかしこれ、128bitゆえ多くの言語でのデフォルトである16進数表記すると32文字(ハイフンを入れると36文字)になります。

流石に長すぎて使い勝手がわるいということで私が実装で用いる時には場合によって可逆短縮することがあります。

今回はそれを備忘録代わりにまとめておきます。(普段Python3系を使うので、コードはPython3系で記載しています。)

1:半角英数26文字に短縮(base32)

一つ目、base32エンコードをもちいる方法です。これにより、半角英数26文字に圧縮されます。この手法の嬉しいところは、base32を用いるので「大文字小文字の区別がない」「IやOと紛らわしい1と0が使用されていない」というところです。これなら、もし運用上口頭でIDを伝えなければならなくなったとしても安心です。

import uuid
import base64

def uuid32():
    return base64.b32encode(uuid.uuid4().bytes).decode('ASCII').rstrip('=')

これで、uuid32()が呼び出されると32bitエンコードされ26文字となったUUIDが得られます。

2:半角英数記号22文字に短縮(base64)

二つ目、base64エンコードを用いる方法です。これにより、半角英数記号22文字に圧縮されます。この手法の場合、記号が混ざりますので、URLパラメータなどとして用いる場合は注意が必要です。というのも、標準的なbase64では「+」と「/」が用いられます。これは流石に困る。

ここでPythonには便利なものが用意されていて、URLに使えるbase64の変形型があります。「+」と「/」の代わりに「-」と「_」を用いるものです。それに用いて実装したのが以下のコードです。

import uuid
import base64
def uuid64():
 return base64.urlsafe_b64encode(uuid.uuid4().bytes).decode('ASCII').rstrip('=')

これで、uuid64()が呼び出されるとbase64エンコードされ22文字となったUUIDが得られます。

この手法の問題点は、すべての半角英数字を使いますので、印刷したりするときフォントを気をつけないと「I」と「1」と「l」の見分けがつかない、ということが生じることです。ですが、可用性のある中では圧縮率が最も高いと思いますので、使いどころはあると思います。

※base32、base64ではパディングとして「=」が付加されますが、文字数を揃えたいなど特殊な要求がない限りこれは取り除いてしまっても問題ありません。このコードでは「.rstrip(‘=’)」で取り除いています。もし取り除きたくない場合は「.rstrip(‘=’)」を削除してください。

というわけで簡単にまとめて見ましたが、どうでしょうか。もし他にもっといい手段があればご教授くださいませー!

ではでは。

 

コメントを残す