![]() |
GUID - Warum diese Darstellung als String
Einfach Interessehalber
Warum ist die String-Darstellung einer GUID so wie sie ist? Also : "{12345678-ABCD-1234-ABCD-1234567890AB}". Warum die Geschweiften klammern? Warum die Bindestriche? Genau so gut hätte man diese weg lassen können. Sind 6 Byte in einem String, die eigentlich absolut sinnlos sind. Eine Speicherung ohne diese Zeichen würde doch nichts an der Eindeutigkeit ändern. Also : "12345678ABCD1234ABCD1234567890AB". Was hat man sich also dabei gedacht? |
AW: GUID - Warum diese Darstellung als String
Hmm..
Das Format mit den Minuszeichen kommt vom Inhalt.. ![]() Zitat:
Die Klammen scheint sich Microsoft ausgedacht zu haben. Zitat:
|
AW: GUID - Warum diese Darstellung als String
Hallo,
es gibt da schon unterschiedliche Darstellungen: ![]() Aber warum das so ist, wird dort auch nicht erklärt. :? Vielleicht dienen die Bindestriche nur zur besseren Lesbarkeit, ähnlich wie bei der IBAN-Nr (alle 4 Zeichen folgt ein Leerzeichen). |
AW: GUID - Warum diese Darstellung als String
Zitat:
Und so wurde diese Darstellung eben auch zum Standard für solche IDs generell, auch wenn sie etwas anderes enthalten. |
AW: GUID - Warum diese Darstellung als String
Die WIKI-Seite habe ich schon gelesen. Ich sehe auch, dass die Bindestriche die fünf Komponenten der GUID trennen.
Aber aus Lesbarkeit wird es kaum sein. Wer kann schon eine GUID "lesen" und dem Computer dürfte es bei vergleichen von zwei GUID Wurst sein, ob Bindestriche und Klammern vorhanden sind, oder nicht. Der Link von ghubi01 zeigt aber auch, dass es verschiedene Darstellungsweisen gibt und die Art der Darstellung anscheinen Geschmacksache ist. Ich dachte zuerst, die Darstellungsweise sei irgendwie optimiert um Vergleiche besser durchführen zu können. Ist aber anscheinend nicht so. |
AW: GUID - Warum diese Darstellung als String
Es ist Lesbarkeit, und die GUID setzt sich ja aus definierten Dingen zusammen, und folgt dabei einem festgelegten
![]() Außerdem verwenden manche (zB Microsoft) GUIDs als Registriernummern, die man sich auch mal vorlesen muss. O'Neill |
AW: GUID - Warum diese Darstellung als String
Könnte man sich das nicht auch für 1000 andere Dinge fragen?
MAC-Adressen, IPs, Product-keys, ... |
AW: GUID - Warum diese Darstellung als String
Zitat:
Das könnte man so fort führen. Es ist nun mal so festgelegt. |
AW: GUID - Warum diese Darstellung als String
Als Vorteil sehe ich die Lesbarkeit und eine gewisse Validierung, dass es sich vorliegend tatsächlich um eine GUID handelt und nicht einfach um einen String in der zufällig richtigen Länge.
Nachteilig ist natürlich der Speicherverbrauch und ggf. 1/2 ms längere Rechenzeit. |
AW: GUID - Warum diese Darstellung als String
Zitat:
weil die Reihenfolge der Bytes im Speicher (Little-Endian > BinToHex) nicht mit den decodierten Werten (IntToHex > Big-Endian) übereinstimmt. (außer im alten MacOS)
Code:
zum Selbstausprobieren
LongWord Word Word Byte-Array
01234567-89AB-CDEF-0123-456789ABCDEF 67452301 AB89 EFCD 0123 456789ABCDEF
Delphi-Quellcode:
Ich werde wohl nur einfach nie kappieren, warum der vorletzte Block kein Word und somit nicht auch umgedreht wird,
procedure TForm1.FormCreate(Sender: TObject);
var G: TGUID; S, B: string; begin S := '01234567-89AB-CDEF-0123-456789ABCDEF'; G := StringToGUID('{' + S + '}'); SetLength(B, SizeOf(G) * 2); BinToHex(G, PChar(B), SizeOf(G)); Insert(' ', B, 21); Insert(' ', B, 17); Insert(' ', B, 13); Insert(' ', B, 9); ShowMessage(S + sLineBreak + B); end; jedenfalls nicht dank der aktuellen Typdefinition, wo ich's einfach beim kurz Hingucken immer überseh.
Delphi-Quellcode:
TGUID = packed record
D1: LongWord; D2: Word; D3: Word; //D4: array[0..7] of Byte; // von Microsoft/Delphi D4: array[0..1] of Byte; // meine Interpretation D5: array[0..5] of Byte; // ... end; Zitat:
Sogar viele Datenbanken bieten einen GUID-Typ, um es direkt formatunabhängig zu speichern und optimaler zu suchen. Selbst der Delphi-Compiler bietet diese automatische Konvertierung schon seit Jahrzehnten, zumindestens teilweise bei Interfaces und Konstanten.
Delphi-Quellcode:
const
C: TGUID = '{01234567-89AB-CDEF-0123-456789ABCDEF}'; // hier ja procedure TForm1.FormCreate(Sender: TObject); var G: TGUID; begin G := '{01234567-89AB-CDEF-0123-456789ABCDEF}'; // aber hier nicht :roll: G := TGUID('{01234567-89AB-CDEF-0123-456789ABCDEF}'); // und so auch nicht end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz