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
- CPAN: Data::UUID
- RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace
- The 2004 Perl Advent Calendar: Data::UUID
- CPAN: Tie::DataUUID
- Wikipedia: Universally Unique Identifier
- Wikipedia (en): Universally Unique Identifier
- CPAN: UUID::Tiny
- CPAN: UUID::Random