UUID::Object と UUID::Generator::PurePerl を書いた
UUID と Perl について - daily dayflower でうだうだ書いてたのですが,Pure Perl 実装の UUID generator が欲しくなったので書いてみました(各種 UUID モジュールのインタフェースを共通化するモジュールはまだ書いていません)。
CodeRepos に置いてあります。
- UUID::Object
- UUID::Generator::PurePerl
この記事で反応?をみて,異論がなければ今月中には 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 の略)
- 一応,Data::UUID 互換な結果を得るための
- UUID::Generator::PurePerl という名前だけど,内部で Time::HiRes,Digest::MD5 など使っているので,完全に Perl インタプリタ上で動くわけではない
- でもそれらの XS モジュールは Perl 5.8 以降では corelist に入ってるし,それくらいのネーミングならいいよね?