BLOGTIMES
2012/12/21

16進表記と base64url の容量効率

  php 
このエントリーをはてなブックマークに追加

バイナリのデータをテキストデータとして表すときに16進数表記をよく使いますが、ちょっと長すぎる場合があるのでなんとか短くできないかなと思って色々考えてみたところ、大文字小文字の区別ができる環境の場合はbase64URLを使った方が容量効率がいいという当たり前のことに気づいたのでメモ。

バイナリのものをテキストデータに変換して扱う代表例といえば、データのハッシュ値でしょうか。例として sha256 を考えてみると、入力容量に関わらず得られるハッシュ値はバイナリで 256bit になります。これを16進数表記すると、a~z,0~9を使って1文字 (8 bit) で 4bit を表すことになるので、64文字 (512 bit) となります。テキスト化したことで容量が2倍になってしまいました。これに対して、base64url を使うと A~Z,a~z,0~9,-,_,= を使って1文字 (8 bit) で 6bit を表すことになるので、43文字 (256/6 = 42.6666667)で表すことができます。

まとめるとこんな感じでしょうか。

エンコード 出力容量 文字種 バイナリ x1倍 - 16進数表記 x2倍 a~z,0~9 base64url x4/3倍 A~Z,a~z,0~9,-,_,=

ちなみに今回は base64 ではなく base64url にしているのは、これをファイル名にすることを想定しているからです。
base64 と base64url の違いは base64 が +,/ を使っていたところを -,_ と表記するだけの違いです。

以下、プログラミングメモ。

実際に php でプログラムしてみる

実際にプログラムで書いて確認してみます。今回は簡単にかけそうだったので php で書いてみました。

<?php $str = 'test'; $hash_hex = hash('sha256', $str, false); $hash_bin = hash('sha256', $str, true); $hash_base64url = rtrim(strtr(base64_encode($hash_bin), '+/', '-_'), '='); var_dump($str); var_dump($hash_bin); var_dump($hash_hex); var_dump($hash_base64url);

これを実行すると下記のような結果が得られます。
予想どおりの文字数になっていることが分かります。

$ php test.php string(4) "test" string(32) " L}e/槇ナZミ」ソO ム]lー・ " string(64) "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" string(43) "n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg"

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5459
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン