Data-UUID-MT
view release on metacpan or search on metacpan
lib/Data/UUID/MT.pm view on Meta::CPAN
use 5.006;
use strict;
use warnings;
package Data::UUID::MT;
our $VERSION = '1.001'; # VERSION
use Config;
use Math::Random::MT::Auto;
use Scalar::Util 1.10 ();
use Time::HiRes ();
# track objects across threads for reseeding
my ($can_weaken, @objects);
$can_weaken = Scalar::Util->can('weaken');
sub CLONE { defined($_) && $_->reseed for @objects }
# HoH: $builders{$Config{uvsize}}{$version}
my %builders = (
'8' => {
'1' => ($] ge 5.010 ? '_build_64bit_v1' : '_build_64bit_v1_old' ),
'4' => ($] ge 5.010 ? '_build_64bit_v4' : '_build_64bit_v4_old' ),
'4s' => ($] ge 5.010 ? '_build_64bit_v4s' : '_build_64bit_v4s_old'),
},
'4' => {
'1' => '_build_32bit_v1',
'4' => '_build_32bit_v4',
'4s' => '_build_32bit_v4s',
}
);
sub new {
my ($class, %args) = @_;
$args{version} = 4 unless defined $args{version};
Carp::croak "Unsupported UUID version '$args{version}'"
unless $args{version} =~ /^(?:1|4|4s)$/;
my $int_size = $Config{uvsize};
Carp::croak "Unsupported integer size '$int_size'"
unless $int_size == 4 || $int_size == 8;
my $prng = Math::Random::MT::Auto->new;
my $self = {
_prng => $prng,
_version => $args{version},
};
bless $self, $class;
$self->{_iterator} = $self->_build_iterator;
if ($can_weaken) {
push @objects, $self;
Scalar::Util::weaken($objects[-1]);
}
return $self;
}
sub _build_iterator {
my $self = shift;
# get the iterator based on int size and UUID version
my $int_size = $Config{uvsize};
my $builder = $builders{$int_size}{$self->{_version}};
return $self->$builder;
}
sub create {
return shift->{_iterator}->();
}
sub create_hex {
return "0x" . unpack("H*", shift->{_iterator}->() );
}
sub create_string {
return join "-", unpack("H8H4H4H4H12", shift->{_iterator}->());
}
sub iterator {
return shift->{_iterator};
}
( run in 2.751 seconds using v1.01-cache-2.11-cpan-a49fcb8fa48 )