Tipp: Eindeutige IDs generieren

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Tipp: Eindeutige IDs generieren

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Tipp: Eindeutige IDs generieren

Beitrag von mini990 »

Toller Tipp, danke!

Eine Frage: Ich verwende die Version 1.90.355 vom 10.4.2009
Meine Dokumentation (Helpfiles) sind vom 26.4.2006

Die Funktion UuIDCreate() ist dort - natürlich - nicht enthalten.
Sind die "neuen" Funktionen irgendwo nachlesbar?

Gruß Stefan
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Tipp: Eindeutige IDs generieren

Beitrag von Jan »

Stefan,

in der 1.9 SL1 (das ist die 1.9.355 von 2009) ist UuidCreate() enthalten. Deine Doku ist aber die von der 1.9 (aus 2006). Und in der gab es die in der Tat noch nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Tipp: Eindeutige IDs generieren

Beitrag von mini990 »

Wenn ich mich recht entsinne (ist ja schon Jahre her...) war kein aktueller Helpfile beim Update dabei.
Kann ich das irgendwo nachlesen?

Gruß Stefan
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Tipp: Eindeutige IDs generieren

Beitrag von Jan »

Schau mal bitte in Dein Postfach

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Tipp: Eindeutige IDs generieren

Beitrag von Manfred »

hm, ich habe jetzt einmal etliche Folgen erzeugt. Sehe ich das richtig, dass die immer nach dem gleichen Schema aufgebaut sind?

Zeichenfolge "-" zeichenfolge "-" usw. und die Zeichenfolgen habe immer die gleiche Anzahl in ihrem Auftreten an der jeweiligen Stelle?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Tipp: Eindeutige IDs generieren

Beitrag von Tom »

Hallo, Manfred.

Ja, der gruppierte Aufbau wiederholt sich. Siehe auch hier:

https://de.wikipedia.org/wiki/Universal ... Identifier
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Tipp: Eindeutige IDs generieren

Beitrag von AUGE_OHR »

muss nochmal vorsichtshalber anfragen

Code: Alles auswählen

*     hWndRoot := oDXEobj:GetHWnd()
      hWndRoot := Bin2u(UuidCreate())
ich benötige einen Ersatz für o:GethWnd() weil das DataRef nicht hat.

Frage : welchen Bereich gibt o:GetHWnd() aus ?

mit Bin2u() sind es nur positive Werte während ich mit Bin2l() ja auch negative Werte bekomme ... was ist nun richtig :-k
gruss by OHR
Jimmy
Antworten