Data::UUID - Universally Unique IDentifier gemäß RFC 4122

Veröffentlicht von Thomas Fahle am (Permalink)

Das CPAN-Modul Data::UUID von Ricardo Signes ermöglicht die Erstellung weltweit eindeutiger Universally Unique IDentifier (UUID) gemäß RFC 1422 A Universally Unique IDentifier (UUID) URN Namespace.

UUIDs dienen der eindeutigen Kennzeichnung von Informationen in verteilten Systemen ohne zentrale Koordination.

Ein UUID besteht aus einer 16-Byte-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird. In ihrer Normalform sieht eine UUID beispielsweise so aus

DA2611D6-40EB-11DF-96A3-FE9FC5186A11

Data::UUID kann UUIDs als 16 Byte Long, als String (Normalform), als Hexadezimalzahl und als Base64-kodierten String ausgeben und diese verschiedenen Formate in einander umwandeln. Auch namensbasierte UUIDs können in den genannten Formaten einfach erzeugt werden. Eine Vergleichsfunktion für UUIDs ist ebenfalls im Lieferumfang enthalten.

 

String UUIDs (Normalform)

Die Methode create_str() erzeugt eine zufällige UUID als String.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my $ug = Data::UUID->new();

for ( 1 .. 5 ) {
	print $ug->create_str(), "\n";
}

Das Programm erzeugt z.B. folgende Ausgabe:

17654D24-40EB-11DF-93A0-159FC5186A11
17655904-40EB-11DF-93A0-159FC5186A11
17655BFC-40EB-11DF-93A0-159FC5186A11
17655ECC-40EB-11DF-93A0-159FC5186A11
17656192-40EB-11DF-93A0-159FC5186A11

 

Binäre UUIDs

16-Byte-Zahlen werden mit den Methoden create() oder create_bin() erzeugt. Zur Ausgabe auf dem Bildschirm werden die UUIDs hier mit der Methode to_string() in die Normalform umgewandelt.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my $ug = Data::UUID->new();

   # Die beiden Methoden sind identisch
my $bin_uuid_1 = $ug->create();
my $bin_uuid_2 = $ug->create_bin();

print $ug->to_string( $bin_uuid_1 ) , "\n";
print $ug->to_string( $bin_uuid_2 ) , "\n";

Das Programm erzeugt z.B. folgende Ausgabe:

C9BD82B0-40EC-11DF-9BBF-26A1C5186A11
C9BD89CC-40EC-11DF-9BBF-26A1C5186A11

Die beiden Methoden sind intern identisch; durch den zweimaligen Aufruf werden auch zwei unterschiedliche UUIDs erzeugt.

 

Hexadezimale UUIDs

Die Methode create_hex() erzeugt UUIDs als hexadezimale Zahl.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my $ug = Data::UUID->new();

for ( 1 .. 5 ) {
	print $ug->create_hex(), "\n";
}

Das Programm erzeugt z.B. folgende Ausgabe:

0xEF20D4F840F111DF93B9DFA7C5186A11
0xEF20DD0E40F111DF93B9DFA7C5186A11
0xEF20DE8040F111DF93B9DFA7C5186A11
0xEF20DFD440F111DF93B9DFA7C5186A11
0xEF20E13240F111DF93B9DFA7C5186A11

 

Base64 kodierte UUIDs

Base64 kodierte UUIDs lassen sich mit der Methode create_b64() erzeugen.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my $ug = Data::UUID->new();

for ( 1 .. 5 ) {
	print $ug->create_b64(), "\n";
}

Das Programm erzeugt z.B. folgende Ausgabe:

6JxiLPJA3xGwTFSoxRhqEQ==
9qdiLPJA3xGwTFSoxRhqEQ==
gKpiLPJA3xGwTFSoxRhqEQ==
4qxiLPJA3xGwTFSoxRhqEQ==
Oq9iLPJA3xGwTFSoxRhqEQ==

 

UUIDs vergleichen

Binäre UUIDs lassen sich mit der Methode compare() vergleichen. Falls die UUIDs in einem anderen Format vorliegen, können diese mit den Methoden from_string(), from_hexstring() oder from_b64string() in das binäre Format umgewandelt werden. compare() kann einfach in benutzerdefinierten Vergleichsroutinen für sort verwendet werden.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my @uuids = ();

my $ug = Data::UUID->new();

for ( 1 .. 5 ) {

    # Binary UUIDs
    push( @uuids, $ug->create() );
}

foreach my $uuid ( sort uuid_compare @uuids ) {
    print $ug->to_string($uuid), "\n";
}

sub uuid_compare {
    my $res = $ug->compare( $a, $b );
    return $res;
}

Das Programm erzeugt z.B. folgende Ausgabe:

9C9DC1A8-40EE-11DF-AFFA-9CA3C5186A11
9C9DC5E0-40EE-11DF-AFFA-9CA3C5186A11
9C9DC612-40EE-11DF-AFFA-9CA3C5186A11
9C9DC63A-40EE-11DF-AFFA-9CA3C5186A11
9C9DC662-40EE-11DF-AFFA-9CA3C5186A11

 

Namespace UUIDs

Data::UUID unterstützt die im RFC 4122 vorgeschlagenen Namespaces

  • NameSpace_DNS
  • NameSpace_URL
  • NameSpace_OID
  • NameSpace_X500

Diese Namensräume sollen u.a. gewährleisten,

  • das UUIDs, die aus dem selbem Namen (Ursprung) im selben Namensraum erzeugt werden, stets identisch sind.
  • das UUIDs, die aus dem selbem Namen (Ursprung) in einem anderen Namensraum erzeugt werden, sich von den erstgenannten unterscheiden.

Das nachfolgende Programm liefert auch bei mehrmaligen Aufruf auf unterschiedlichen Rechnern das selbe Ergebnis.

#!/usr/bin/perl
use warnings;
use strict;

use Data::UUID;

my $ug = Data::UUID->new();

for my $name ( 1 .. 5 ) {
    print "Name: $name\n";
    print "Namespace DNS: ",
        $ug->create_from_name_str( NameSpace_DNS, $name ), "\n";
    print "Namespace URL: ",
        $ug->create_from_name_str( NameSpace_URL, $name ), "\n";
}

Das Programm erzeugt folgende Ausgabe:

Name: 1
Namespace DNS: AFD0B036-625A-3AA8-B639-9DC8C8FFF0FF
Namespace URL: 9311744C-3746-3502-84C9-D06E8B5EA2D6
Name: 2
Namespace DNS: 9C45C2F1-1761-3DAA-AD31-1FF8703AE846
Namespace URL: 4BB9C1A0-DED7-3F16-93FB-BD2CBAC9A815
Name: 3
Namespace DNS: 15E0BA07-10E4-3D7F-AAFF-C00FED873C88
Namespace URL: 78F8CF0B-0C6A-3FB8-9D24-1E4A8E882EAA
Name: 4
Namespace DNS: BC27B4DB-BC0F-34F9-AE8E-4B72F2D51B60
Namespace URL: C8F0193B-CDC1-3F89-93DB-2FC9698580BD
Name: 5
Namespace DNS: 7586BFED-B8B8-3BB3-9C95-09A4A79DC0F7
Namespace URL: 80C57EB0-2ACB-36AC-89F9-95F0481C77A6

 

Siehe auch

Weitere Posts