Technologische Neuigkeiten, Bewertungen und Tipps!

So generieren Sie in Swift eine zufällige eindeutige Kennung mit UUID

Hinweis: Der folgende Artikel hilft Ihnen weiter: So generieren Sie in Swift eine zufällige eindeutige Kennung mit UUID

Zurück zum Blog

Zufällige eindeutige Bezeichner (UUIDs) sind bei der Swift-Programmierung äußerst nützlich. Stellen Sie sich vor, Sie speichern Objekte in einer Datenbank und jedes Objekt benötigt eine eindeutige ID. Die generierte ID muss eindeutig und universell für alle Geräte, alle Benutzer und alle Objekte in der Datenbank sein. Wie generiert man eine solche ID?

Der Begriff UUID steht für Universally Unique Identifier. In Swift können wir UUIDs mit der UUID-Struktur generieren.

Hier ist wie:

let Identifier = UUID()
print(Bezeichner)
// Ausgabe: 8D31B96A-02AC-4531-976F-A455686F8FE2

Der UUID()-Initialisierer generiert 128 Zufallsbits. Da die UUID-Struktur dem CustomStringConvertible entspricht, können wir sie als Zeichenfolge drucken.

Wenn Sie die UUID-Zeichenfolge direkt abrufen möchten, können Sie die Eigenschaft uuidString direkt verwenden. So was:

print(identifier.uuidString)

Lassen Sie uns nun herausfinden, wie diese Kennungen tatsächlich funktionieren!

Die UUID-Struktur entspricht auch Hashable, sodass Sie UUIDs in einem Set verwenden können.

Mit UUID generierte Bezeichner sind universell eindeutige Bezeichner. Das bedeutet, dass die Wahrscheinlichkeit, dass auf jedem Gerät auf der Welt zweimal dieselbe Kennung generiert wird, im Grunde gleich Null ist!

Wie so? Werfen wir einen Blick auf die Geschichte, um das herauszufinden.

Viele Werkzeuge, Technologien, Mechanismen und Produkte weltweit basieren auf Standards. Ein Maß für die Länge ist beispielsweise der Meter. Das Messgerät ist nicht nur etwas, worauf wir uns geeinigt haben, es basiert tatsächlich auf der Lichtgeschwindigkeit.

Ein Meter entspricht genau der Distanz, die Licht im Vakuum in 1 / 299.792.458 Sekunde zurücklegt. Die Lichtgeschwindigkeit ist konstant, ändert sich also nicht. Vorausgesetzt, Sie können es messen, können Sie immer herausfinden, wie lang ein Meter genau ist, unabhängig davon, wo Sie sich befinden. Das ist das Schöne an Standards!

Manche Standards sind nicht so spektakulär. Nehmen wir zum Beispiel RFC 4122. Dieses Dokument beschreibt den Standard für universell eindeutige Identifikatoren. Es wurde 2005 von Informatikern erstellt und von der Internet Engineering Taskforce (IETF) als RFC („Request For Comments“) veröffentlicht.

In der Technologie-Community ist ein RFC eine Veröffentlichung von Informatikern. Es ist, als würde man sagen: „Sehen Sie, wir haben uns dies und das ausgedacht, würden Sie es bitte kommentieren?“ Die Veröffentlichung wird von anderen Wissenschaftlern einem Peer-Review unterzogen und auf Richtigkeit und Fehler aller Art überprüft. Einige RFCs werden dann von Institutionen wie der IETF übernommen.

Sie haben im Grunde alles wissenschaftlich herausgefunden!

Wenn ein RFC veröffentlicht wird, wird er nicht sofort zum Standard. Einige Institutionen übernehmen es ohnehin als Standard, wie z Apple Verwendung von RFC 4122 bei der Implementierung von UUID. Die IETF ist nicht die einzige Institution, die RFCs veröffentlicht und einige davon als Standards akzeptiert; andere Institutionen sind beispielsweise ISO, IEC und W3C.

Es lohnt sich zu wissen, dass diese Organisationen gute Arbeit leisten und dass es einen strengen Prozess gibt, um zu bestimmen, was Standard ist und was nicht. Dank der Standardisierung von Dingen wie HTML, Messgerät und UUIDs wissen wir eindeutig, wie wir die Tools, mit denen wir arbeiten, richtig messen, implementieren und formatieren.

Kommen wir zurück zu den UUIDs!

RFC 4122 sieht beängstigend aus, aber versuchen Sie es durchzulesen – so beängstigend ist es überhaupt nicht. Sie werden viel darüber lesen, was das Format genau ist, und in den Anhängen finden Sie sogar ein paar Programmierbeispiele.

Eine UUID besteht aus einer 128-Bit-Zahl, also 128 Einsen und Nullen. Es gibt eine sogenannte kanonische Textdarstellung, die wie folgt aussieht:

123e4567-e89b-12d3-a456-426655440000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

Lass uns genauer hinschauen:

  • Eine UUID besteht aus 16 Oktetten, also 16 Gruppen von 8 Bits (16 × 8 = 128), die als 32 hexadezimale Ziffern dargestellt werden und in 5 Gruppen angezeigt werden, getrennt durch Bindestriche (-).
  • So wie eine Dezimalziffer von 0 bis 9 reicht, reicht eine Hexadezimalziffer von 0 bis F. Es ist wie ein Alphabet mit 16 Zeichen: 0123456789ABCDEF. Warum es verwenden? Es ist einfacher, eine UUID als 32 Textzeichen zu kodieren als als 128 Einsen und Nullen.
  • Die dritte und vierte Gruppe verfügen über spezielle M- und N-Platzhalter, die die Version und Variante des UUID-Algorithmus angeben. Das ist Schlau! Ein Verweis darauf, welchen Algorithmus wir zum Codieren der UUID verwendet haben, ist direkt integriert.

Als Softwareentwickler lohnt es sich, sich mit binären, dezimalen und hexadezimalen Zahlensystemen vertraut zu machen. Der RGB-Farbraum verwendet beispielsweise Hexadezimalzahlen, um Farben auszudrücken!

Unter iOS interessiert uns vor allem RFC 2144 Version 4. Die früheren Versionen der universell eindeutigen Identifikatoren stützten sich auf Datum, Uhrzeit, Geräte-MAC-Adresse und Namespace-Identifikatoren, um eindeutige IDs zu generieren. Version 4 basiert auf Zufälligkeit.

Immer wenn die UUID-Struktur eine neue ID generiert, führt sie grundsätzlich 122 Würfelwürfe durch, um 122 Zufallsbits zu erhalten. (Einige der 128 Bit werden für Versions- und Variantenindikatoren verwendet).

Eine kurze Rechnung zeigt uns, dass dies zu 2122 = 5,3×1036 verschiedenen UUIDs führt, was 5,3 Undecillion IDs oder 5,3 Billionen Billionen Billionen oder einer 5,3 gefolgt von 36 Nullen entspricht. Das sind viele Identifikatoren …

Wie hoch ist die Wahrscheinlichkeit, dass zwei gleiche IDs generiert werden? Hier ein kurzer Vergleich:

  • Die Anzahl der IDs, die Sie generieren müssen, um eine Kollisionswahrscheinlichkeit von 50 % zu haben (d. h. zwei gleiche IDs), beträgt 2,71 Trillionen oder 2,71×1018
  • Wenn Sie 1 Milliarde IDs pro Sekunde generieren, würden Sie dafür 85 Jahre brauchen
  • Um alle diese IDs zu speichern, würden Sie eine Datei mit etwa 45 Exabyte oder 45 Millionen Terabyte erstellen, was viel mehr ist als die größten Datenbanken der Welt
    (Quelle)

In jeder praktischen Hinsicht kann man mit Sicherheit davon ausgehen, dass die UUID weltweit eindeutig ist, und zwar auf allen Geräten, Datenbanken, iPhones usw. auf der Welt. Die Wahrscheinlichkeit, dass dieselbe UUID zweimal generiert wird, ist vernachlässigbar.

Und das Coole daran ist, dass wir, wenn wir in Zukunft größere, leistungsstärkere Computer haben, einfach ein Bit hinzufügen und am Ende die doppelte Anzahl potenzieller UUIDs erhalten!

Der praktischste Einsatzbereich für UUIDs in der iOS-Entwicklung liegt in Datenbanken. Bedenken Sie, dass Sie Benutzerdaten in einer Datenbank speichern. Jeder Benutzer benötigt eine eindeutige ID, damit Sie in Abfragen und APIs auf den Benutzer verweisen können.

Hier ist ein Beispiel:

Klasse Benutzer {
Var-ID: UUID
var Benutzername:String
var email:String
}

Sie könnten ein neues Benutzerobjekt wie folgt erstellen:

var user = Benutzer(Bezeichner: UUID(), Benutzername: „arthur42“, E-Mail: „[email protected]”)

Sie könnten auch eine Benutzerfabrik erstellen, um die Verantwortung für die Generierung neuer UUIDs zu abstrahieren. So was:

Klasse UserFactory {
func createUser() -> Benutzer {
return User(identifier: UUID(), username: „“, email: „“)
}
}

Es könnte sinnvoller sein, UUIDs als Zeichenfolgen zu speichern, insbesondere wenn Sie Benutzerdaten als JSON formatieren oder an eine Webservice-API senden möchten. So was:

Klasse Benutzer {
Var-Bezeichner:String

}

let user = User(identifier: UUID().uuidString, )

Es ist unpraktisch, Rohbytes in Daten zu kodieren, die als Zeichenfolgen wie JSON gespeichert sind. Es ist einfacher, Zeichenfolgen zu verwenden, obwohl die von Ihnen verwendete Datenbank möglicherweise Rohbytes effizienter speichert und abfragt als Zeichenfolgen.

Viele Webservices und APIs können eindeutige Kennungen für Sie generieren, sodass Sie sich nicht so viele Gedanken über deren Implementierung machen müssen. So wie beispielsweise Firebase automatisch seine eigenen UUIDs erstellt:

let ref = Database.child(“Benutzer”).childByAutoId()

Und das ist alles!

Wie immer bringt ein tieferes Eintauchen in ein iOS-Entwicklungsthema eine Fülle von Informationen zum Vorschein. Es ist faszinierend zu sehen, wie RFCs im Hinblick auf die Generierung eindeutiger Identifikatoren funktionieren und wie wir ihre Einzigartigkeit sicherstellen können. Mit Wissenschaft!

Table of Contents