Tipp: Eindeutige IDs generieren
Verfasst: Fr, 26. Jun 2015 20:03
Wir haben hier ja wiederholt die Diskussion über AutoIncrement-Felder und die Problematik mit eindeutigen Zählern in Netzwerken gehabt.
Wenn es jedoch nur darum geht, eine eindeutige Identifizierung zu erlauben, ist die UUID das Mittel der Wahl. Eine UUID ist ein "Universally Unique Identifier", also ein Merkmal, das sogar weltweit eindeutig ist. Seit der Version 1.9 enthält Xbase++ Wrapper-Funktionen für die entsprechende Windows-Funktionalität. Mit:
myUuid := UuidCreate()
lässt sich ein solcher Identifier erzeugen - zunächst binär. Mit:
cUuid := UuidToChar(myUuid)
entsteht daraus eine 36 Zeichen lange Zeichenfolge (hexadezimal, gruppiert, z.B. "6f792f1f-e17f-4591-9d23-5c024551e839"), bei der mit extrem hoher Wahrscheinlichkeit (1 / 5*10^36) davon auszugehen ist, dass sie erstens auf dem System und zweitens sogar global noch nie verwendet wurde.
Erzeugt man also interne "Nummerierungen" - für Kunden, Rechnungen, Angebote, Einträge in abhängigen Tabellen usw. -, so kann man sich die Herumhempelei mit Zählern, Zählertabellen und ähnlichem Kokolores sparen, wenn es nur darum geht, Datensätze anderen eindeutig zuzuordnen. Ich mache das schon seit einer Weile so, habe hier aber nur in anderen Kontexten Hinweise auf UuidCreate() gefunden. "Interne Nummer" kann man leichterhand hierdurch ersetzen, muss dann allerdings mit alphanumerischen Indexen hantieren.
Wenn es jedoch nur darum geht, eine eindeutige Identifizierung zu erlauben, ist die UUID das Mittel der Wahl. Eine UUID ist ein "Universally Unique Identifier", also ein Merkmal, das sogar weltweit eindeutig ist. Seit der Version 1.9 enthält Xbase++ Wrapper-Funktionen für die entsprechende Windows-Funktionalität. Mit:
myUuid := UuidCreate()
lässt sich ein solcher Identifier erzeugen - zunächst binär. Mit:
cUuid := UuidToChar(myUuid)
entsteht daraus eine 36 Zeichen lange Zeichenfolge (hexadezimal, gruppiert, z.B. "6f792f1f-e17f-4591-9d23-5c024551e839"), bei der mit extrem hoher Wahrscheinlichkeit (1 / 5*10^36) davon auszugehen ist, dass sie erstens auf dem System und zweitens sogar global noch nie verwendet wurde.
Erzeugt man also interne "Nummerierungen" - für Kunden, Rechnungen, Angebote, Einträge in abhängigen Tabellen usw. -, so kann man sich die Herumhempelei mit Zählern, Zählertabellen und ähnlichem Kokolores sparen, wenn es nur darum geht, Datensätze anderen eindeutig zuzuordnen. Ich mache das schon seit einer Weile so, habe hier aber nur in anderen Kontexten Hinweise auf UuidCreate() gefunden. "Interne Nummer" kann man leichterhand hierdurch ersetzen, muss dann allerdings mit alphanumerischen Indexen hantieren.