読者です 読者をやめる 読者になる 読者になる

24/7 twenty-four seven

iOS/OS X application programing topics.

UUIDを少し短くするUUIDShortener

Objective-C iOS

kishikawakatsumi/UUIDShortener · GitHub


ちょっと仕事でUUIDっぽい文字列を限られた幅の場所に表示する必要があったので書きました。

具体的にはレシートに識別子を印字したいという要件で、識別子はUUIDを振っているのでそれでいいのですが、レシートに印字するにはちょっと長すぎて2行になってしまうのでその点が問題でした。


そこでレシートの幅に収まるようにUUIDを別の表現に変換するのが`UUIDShortener`です。


実際に適用してみると下記のようになります。

20131101003300


上記のレシートに印字されている`NJ6NYLNKBRGSNCUF54Z53R4FVU`という文字列は、このライブラリを使って復元すると`6A7CDC2D-AA0C-4D26-8A85-EF33DDC785AD`というUUIDに復元されます。


UUIDは32桁の16進表記ですが、`UUIDShortener`を使って圧縮すると26桁のアルファベットと数字表記になります。
区切り記号も合わせると10桁ぶん短く表示できます。


使いかたは下記のようになります。

UUIDを圧縮する
/* Shorten UUID string */
NSUUID *UUID = [NSUUID UUID]; // => 40256F2F-3211-49CD-BC1F-DD5197D2F0F9
NSString *shortUUIDString = UUID.shortUUIDString;
NSLog(@"Short UUID:\t%@", shortUUIDString);
// => Short UUID:	    IASW6LZSCFE43PA73VIZPUXQ7E
圧縮した文字列から元のUUIDを復元する
/* Restore UUID string from short string */
NSString *restoredString = [NSUUID UUIDStringFromShortUUIDString:shortUUIDString];
NSLog(@"Restored UUID:\t%@", restoredString);
// => Restored UUID:	40256F2F-3211-49CD-BC1F-DD5197D2F0F9


仕組みですが、UUIDをいったんバイナリに戻し、それをBase32でエンコードしています。
もともと16進表記だったものが使える文字が増えるので結果的に短く表現できるということになります。


また、Base32はO(オー)、l(エル)と紛らわしい0(ゼロ)と1(イチ)があらかじめ除かれているので、検索などで識別子を入力する場合や、問題を調査するときに口頭で伝えてもらう場合などに都合がいいというのも良い点でした。大文字小文字を区別する必要がないというのも使い勝手がいいエンコード方式です。

参考

Base32 - Wikipedia, the free encyclopedia


もっと短くしたいという場合にはBase64Ascii85 (Base85)などを使えばいいかと思います。ただ、大文字小文字の区別ができたり、記号が入ったりするので入力や伝達が少し難しくなりますね。

エンジニア募集中

ユビレジでは現在エンジニアをiOS、サーバーサイドともに積極的に募集中です。
興味のあるかたは私までお声がけください。