UUID::Object と UUID::Generator::PurePerl を書いた

UUID と Perl について - daily dayflower でうだうだ書いてたのですが,Pure Perl 実装の UUID generator が欲しくなったので書いてみました(各種 UUID モジュールのインタフェースを共通化するモジュールはまだ書いていません)。

CodeRepos に置いてあります。

この記事で反応?をみて,異論がなければ今月中には CPAN にあげようかなと思っています。

SYNOPSIS としては以下のような感じ。

use UUID::Object;

my $uuid = UUID::Object->create_from_base64("a6e4EJ2tEdGAtADAT9QwyA==");
print $uuid->as_string;
#=> 6ba7b810-9dad-11d1-80b4-00c04fd430c8

print $uuid->as_hex;
#=> 6ba7b8109dad11d180b400c04fd430c8

UUID::Generator::PurePerl の使用例は,

use UUID::Generator::PurePerl;

$ug = UUID::Generator::PurePerl->new();

$uuid = $ug->generate_v1();

print $uuid->as_string();
#=> '029f7a0e-11d0-11de-82cf-f858ff1d5fce'

です。

  • 将来的に Any::UUID::* でインタフェースを共通化することを考えると,「UUID の表象」と「UUID の生成」はわけたほうがよいのではないかと考えた
    • UUID のコンテナとして UUID::Object
    • UUID の生成系(Pure Perl)実装として UUID::Generator::PurePerl
  • Data::UUID では UUID をバイナリ表象で取得すると,architecture dependent(バイトオーダー)な形式となってしまう
    • そのくせ v3, v5 でメッセージダイジェストを計算するときに,namespace UUID を network order に変換して,結果をまた変換している
    • string 表象と hexstring 表象は portable。binary 表象と Base64 表象では depend on architecture
      • string はあたりまえとして,その他の表象がちと非直感的
  • なので,UUID::Object では,内部表象を network order octets とし,実行系に依存しない形にした
    • 一応,Data::UUID 互換な結果を得るための as_binary_np() などの関数も追加した(np は non-portable の略)
  • UUID::Generator::PurePerl という名前だけど,内部で Time::HiRes,Digest::MD5 など使っているので,完全に Perl インタプリタ上で動くわけではない
    • でもそれらの XS モジュールは Perl 5.8 以降では corelist に入ってるし,それくらいのネーミングならいいよね?