The
Data::UUID module has the annoying behavior that it will not fail if you provide an invalid namespace when creating a v3 UUID. It will generate a UUID, but depending on the circumstances it may generate a different UUID in subsequent calls. Consider the following example:
#!/usr/bin/perl
use strict;
use warnings;
use Data::UUID;
use UUID::Tiny;
sub v3_data_uuid {
my $namespace = shift;
my $name = shift;
my $ug = shift;
$ug = new Data::UUID unless defined $ug;
return lc($ug->create_from_name_str($namespace, $name));
}
sub v3_uuid_tiny {
my $namespace = shift;
my $name = shift;
return UUID_to_string(create_UUID(UUID_V3, $namespace, $name));
}
# Generate a v3 UUID using Data::UUID
print "Data::UUID\n";
my $ug = new Data::UUID;
print ' 1. ', lc($ug->create_from_name_str(UUID_NS_DNS, 'abc')), "\n";
print ' 2. ', lc($ug->create_from_name_str(UUID_NS_DNS, 'abc')), "\n";
print ' 3. ', v3_data_uuid(UUID_NS_DNS, 'abc'), "\n";
print ' 4. ', v3_data_uuid(UUID_NS_DNS, 'abc'), "\n";
print ' 5. ', v3_data_uuid(UUID_NS_DNS, 'abc', $ug), "\n";
# Generate a v3 UUID using UUID::Tiny
print "UUID::Tiny\n";
print ' 1. ', UUID_to_string(create_UUID(UUID_V3, UUID_NS_DNS, 'abc')), "\n";
print ' 2. ', UUID_to_string(create_UUID(UUID_V3, UUID_NS_DNS, 'abc')), "\n";
print ' 3. ', v3_uuid_tiny(UUID_NS_DNS, 'abc'), "\n";
print ' 4. ', v3_uuid_tiny(UUID_NS_DNS, 'abc'), "\n";
# Generate a v3 UUID using Data::UUID with an invalid namespace
print "Data::UUID - bad namespace\n";
my $namespace = 'namespace';
print ' 1. ', lc($ug->create_from_name_str($namespace, 'abc')), "\n";
print ' 2. ', lc($ug->create_from_name_str($namespace, 'abc')), "\n";
print ' 3. ', v3_data_uuid($namespace, 'abc'), "\n";
print ' 4. ', v3_data_uuid($namespace, 'abc'), "\n";
print ' 5. ', v3_data_uuid($namespace, 'abc', $ug), "\n";
# Generate a v3 UUID using UUID::Tiny with an invalid namespace
print "UUID::Tiny - bad namespace\n";
print ' 1. ', UUID_to_string(create_UUID(UUID_V3, $namespace, 'abc')), "\n";
This example also uses
UUID::Tiny as a point of comparison. The output that I get when running this example is:
$ ./uuid.pl
Data::UUID
1. 1fc38bb9-aae5-3dba-9894-38925088c9c0
2. 1fc38bb9-aae5-3dba-9894-38925088c9c0
3. 1fc38bb9-aae5-3dba-9894-38925088c9c0
4. 1fc38bb9-aae5-3dba-9894-38925088c9c0
5. 1fc38bb9-aae5-3dba-9894-38925088c9c0
UUID::Tiny
1. 5bd670ce-29c8-3369-a8a1-10ce44c7259e
2. 5bd670ce-29c8-3369-a8a1-10ce44c7259e
3. 5bd670ce-29c8-3369-a8a1-10ce44c7259e
4. 5bd670ce-29c8-3369-a8a1-10ce44c7259e
Data::UUID - bad namespace
1. 15da4c6e-29ae-3f6c-a7ed-ec36373d4e5d
2. 15da4c6e-29ae-3f6c-a7ed-ec36373d4e5d
3. 8fa130be-2517-3e29-a087-c7d75545a62c
4. 8fa130be-2517-3e29-a087-c7d75545a62c
5. 8fa130be-2517-3e29-a087-c7d75545a62c
UUID::Tiny - bad namespace
UUID::Tiny::string_to_uuid(): 'namespace' is no UUID string! at ./uuid.pl line 50
When a valid UUID is used for the namespace, Data::UUID consistently generates the same value. However, if I pass in a bad value such as the string literal
namespace
, then I get different values depending on how/where/when it is called. UUID::Tiny on the other hand dies with a nice error message telling me exactly what is wrong.