IDs

Die ID

IDs sind in D1 meist vom Typ IId.

Wir haben uns für die Verwendung von flexiblen IDs für D1 entschieden. Daher kann die ID aus einem der folgenden Typen bestehen:

  • einem Integer (im Stream: 4 Bytes)
  • einem String (im Stream: variabel, UTF-8)
  • einer UUID (im Stream: 16+1 Bytes)

Die Unterscheidung erfolgt durch eine 1 Byte Header. Leere oder ungültige IDs haben einfach keine Daten.

Somit sind wir flexibel, bei gleichzeitigem geringen Overhead.

  • Wird höchste Performance benötigt, verwendet man numerische IDs.
  • Steht Lesbarkeit an vorderster Stelle, nimmt man den String.
  • Für Unverwechselbarkeit und eindeutige APIs ist die UUID geeignet.

Die ID mag später noch um andere Typen erweitert werden. Das ist sehr leicht möglich, indem man eine weitere IIdFactory bei der CIdFactory registriert:

CIdFactory.registerFactory(aFactory);

Die CIdFactory dient auch zum erzeugen der IDs. “Zufällige” IDs werden so erstellt:

// wird einfach inkrementiert
IId id1 = CIdFactory.create(EIdType.INT);

// ist eine UUID als String
IId id2 = CIdFactory.create(EIdType.STRING);

// ist eine UUID
IId id3 = CIdFactory.create(EIdType.UUID);

// leere ID
IId id4 = CIdFactory.create(EIdType.EMPTY);

Für das gezielte Erstellen einer ID mit bestimmten Type benutzt man eine andere Methode:

IId id1 = CIdFactory.create(EIdType.INT, 15);
IId id2 = CIdFactory.create(EIdType.STRING, "SYSTEM");
IId id3 = CIdFactory.create(EIdType.UUID, "e87092d7-2f74-4d7b-9eef-8bdd7789b049");

Wenn nur das Objekt zur Verfügung steht, und der Type nicht interessiert, kann man folgendermaßen vorgehen:

IId id1 = CIdFactory.create(object);

Hier wird zunächst geprüft, ob das Objekt null ist (–>EMPTY). Ist das nicht der Fall, wird versucht, mithilfe der registrierten ID-Factories eine ID zu erstellen. Wenn gar nichts klappt, ergibt die Umwandlung eine String-ID mittels object.toString().

Die CIdFactory ist auch für eine ganze Reihe von I/O Methoden gut. So werden IId-Objekte aus Streams und aus Strings gelesen und wieder hineingeschrieben.

Ebenso gibt es eine Reihe von Methoden für IId-Arrays:

  • Lesen aus und Schreiben in Streams
  • Lesen aus und Schreiben in Strings
  • Lesen aus und Schreiben in String-Arrays
  • Lesen aus und Schreiben in String-Listen
  • Erzeugen von zufälligen Arrays
  • Vergleichs-Methoden

Die Target-ID (TID)

Die Target-ID ist eindeutig für ein Target innerhalb eines Namespaces. Dieselbe TID kann in anderen Namespaces wieder existieren.

Bei der Registrierung von Targets wird eine “zufällige” ID generiert, wenn keine ID mitgegeben wurde. Dafür wird eine numerische ID generiert. In der Regel ist das okay, weil Target-IDs nicht “sprechen” müssen. Für Log-Files gibt es andere Möglichkeiten, TIDs mit Namensstrings zu verbinden. (TODO: Link NameDb)

Für immer wieder benutzte TIDs gibt es die Klasse CWellKnownTID, welche eine Reihe von String-IDs für bekannte Targets definiert.

Target-Objekte können leicht über die ITargetRegistry jedes Namespaces gefunden werden.

Die Namespace-ID (NID)

Die Namespace-ID ist eindeutig für einen Namespaces innerhalb einer D1-Instanz. Meist verwendet man hier String-IDs für bessere Lesbarkeit von Target-Adressen.

Die NODE-ID (INodeID)

Die NODE-ID besteht ist nicht so variable wie die anderen IDs und besteht lediglich aus einer UUID.

Sie ist die ID einer D1-Instanz und damit einmalig.

(TODO: URL, Link) D1

Die Target-Adresse

Die Target-Adresse ist die Adresse, unter der eine Nachricht ein Target erreichen kann. Die Position des Targets ist damit in einem D1-Netzwerk vollständig beschrieben.

Die Adresse besteht aus drei Komponenten:

In JAVA wird die Adresse dargestellt durch ihr Interface ITargetAddress, sowie der Klasse CTargetAddress. Letztere ist nicht public; zur Instanziierung gibt es die Factory CTargetAddressFactory.