root/lang/perl/UUID-Generator-PurePerl/trunk/lib/UUID/Generator/PurePerl.pm @ 32886

Revision 32886, 4.1 kB (checked in by dayflower, 4 years ago)

is going to be released on CPAN (version 0.80)

Line 
1package UUID::Generator::PurePerl;
2
3use strict;
4use warnings;
5use 5.006;
6
7our $VERSION = '0.80';
8
9use Carp;
10use Digest;
11use Time::HiRes;
12use UUID::Object;
13use UUID::Generator::PurePerl::RNG;
14use UUID::Generator::PurePerl::NodeID;
15use UUID::Generator::PurePerl::Util;
16
17sub new {
18    my $class = shift;
19    my $self  = bless {}, $class;
20
21    return $self;
22}
23
24sub rng {
25    my ($self) = @_;
26
27    if (! defined $self->{rng}) {
28        $self->{rng} = UUID::Generator::PurePerl::RNG->singleton();
29    }
30
31    return $self->{rng};
32}
33
34sub node_getter {
35    my ($self) = @_;
36
37    if (! defined $self->{node_getter}) {
38        $self->{node_getter} = UUID::Generator::PurePerl::NodeID->singleton();
39    }
40
41    return $self->{node_getter};
42}
43
44sub get_timestamp {
45    return Time::HiRes::time();
46}
47
48sub get_clk_seq {
49    my $self = shift;
50    my $node_id = shift;
51
52    my $inc_seq = 0;
53
54    my $ts = $self->get_timestamp();
55    if (! defined $self->{last_ts} || $ts <= $self->{last_ts}) {
56        $inc_seq ++;
57    }
58    $self->{last_ts} = $ts;
59
60    if (! defined $self->{last_node}) {
61        if (defined $node_id) {
62            $inc_seq ++;
63        }
64    }
65    else {
66        if (! defined $node_id || $node_id ne $self->{last_node}) {
67            $inc_seq ++;
68        }
69    }
70    $self->{last_node} = $node_id;
71
72    if (! defined $self->{clk_seq}) {
73        $self->{clk_seq} = $self->_generate_clk_seq();
74        return $self->{clk_seq} & 0x03ff;
75    }
76
77    if ($inc_seq) {
78        $self->{clk_seq} = ($self->{clk_seq} + 1) % 65536;
79    }
80
81    return $self->{clk_seq} & 0x03ff;
82}
83
84sub _generate_clk_seq {
85    my $self = shift;
86
87    my @data;
88    push @data, q{}  . $$;
89    push @data, q{:} . Time::HiRes::time();
90
91    return digest_as_16bit(@data);
92}
93
94sub generate_v1 {
95    my $self = shift;
96
97    my $node = $self->node_getter->node_id();
98    my $ts   = $self->get_timestamp();
99
100    return
101        UUID::Object->create_from_hash({
102            variant => 2,
103            version => 1,
104            node    => $node,
105            time    => $ts,
106            clk_seq => $self->get_clk_seq($node),
107        });
108}
109
110sub generate_v1mc {
111    my $self = shift;
112
113    my $node = $self->node_getter->random_node_id();
114    my $ts   = $self->get_timestamp();
115
116    return
117        UUID::Object->create_from_hash({
118            variant => 2,
119            version => 1,
120            node    => $node,
121            time    => $ts,
122            clk_seq => $self->get_clk_seq(undef),
123        });
124}
125
126sub generate_v4 {
127    my ($self) = @_;
128
129    my $b = q{};
130    for (1 .. 4) {
131        $b .= pack 'I', $self->rng->rand_32bit;
132    }
133
134    my $u = UUID::Object->create_from_binary($b);
135
136    $u->variant(2);
137    $u->version(4);
138
139    return $u;
140}
141
142sub generate_v3 {
143    my ($self, $ns, $data) = @_;
144
145    return $self->_generate_digest(3, 'MD5', $ns, $data);
146}
147
148sub generate_v5 {
149    my ($self, $ns, $data) = @_;
150
151    return $self->_generate_digest(5, 'SHA-1', $ns, $data);
152}
153
154sub _generate_digest {
155    my ($self, $version, $digest, $ns, $data) = @_;
156
157    $ns = UUID::Object->new($ns)->as_binary;
158
159    my $dg = Digest->new($digest);
160
161    $dg->reset();
162
163    $dg->add($ns);
164
165    $dg->add($data);
166
167    my $u = UUID::Object->create_from_binary($dg->digest);
168    $u->variant(2);
169    $u->version($version);
170
171    return $u;
172}
173
1741;
175__END__
176
177=head1 NAME
178
179UUID::Generator::PurePerl - Universally Unique IDentifier (UUID) Generator
180
181=head1 DESCRIPTION
182
183This module is going to be marked as *DEPRECATED*.
184
185Do not use this module in your applications / modules.
186
187Currently, this implementation is still functional.
188If you want to know API, please refer to PODs in version 0.05.
189
190=head1 FUTURE PLAN
191
192=over 2
193
194=item (1) will be renewed module that behaves like backend generator to L<Data::GUID>
195
196=item (2) will be stub module, and be marked as DEPRECATE
197D
198
199=item (3) will be withdrawn from CPAN after a while
200
201=back
202
203=head1 AUTHOR
204
205ITO Nobuaki E<lt>banb@cpan.orgE<gt>
206
207=head1 LICENSE
208
209This library is free software; you can redistribute it and/or modify
210it under the same terms as Perl itself.
211
212=head1 SEE ALSO
213
214L<Data::GUID>, L<UUID::Object>.
215
216version 0.05: L<http://search.cpan.org/~banb/UUID-Generator-PurePerl-0.05/>.
217
218=cut
Note: See TracBrowser for help on using the browser.