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でも問題ないだろう。