UUIDの生成

今回欲しいのはバージョン4 (ランダム)なので Data::UUID::MT を使う。名前の通りメルセンヌ・ツイスターを使っているようだ。

use Data::UUID::MT;
say Data::UUID::MT->new->create_string; # xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx

Data::UUID という古参モジュールがあるが、1.220ではバージョン1 (MACアドレスと時間ベース)とバージョン3 (DNS名やURLなどのMD5ベース)だけに対応している。メンテナは今後パッチのマージのみで自ら実装追加は行わないらしい。

use Data::UUID;
say Data::UUID->new->create_str; # xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx
say Data::UUID->new->create_from_name_str(NameSpace_DNS, 'www.example.com') # 5DF41881-3AED-3515-88A7-2F4A814CF09E

UUID::Tiny というのもあって、バージョン1,3,4に加えてバージョン5 (SHA-1ベース)に対応している。

use UUID::Tiny qw(:std);
say create_uuid_as_string; # xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx
say create_uuid_as_string(UUID_V3, UUID_NS_DNS, 'www.example.com'); # 5df41881-3aed-3515-88a7-2f4a814cf09e
say create_uuid_as_string(UUID_V4); # xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx
say create_uuid_as_string(UUID_V5, UUID_NS_DNS, 'www.example.com'); # 2ed6657d-e927-568b-95e1-2665a8aea6a2

Tinyと言われるとコンパクトそうで心が惹かれる。ただし UUID::Tiny 1.03 では乱数生成にrand()を16ビットずつ使っているようだった。WindowsではPerlのバージョンやディストロによっては通常より衝突しやすいかもしれない。*1

*1:perldocには暗号学的に安全でないと書いているが、UUIDは単に衝突しにくいIDであって秘密のIDとして使うものではないので、その点はrandでもMTでも問題ないだろう。