![]() |
GUID nicht unique unter iOS / Android
Hallo,
kann es sein, dass TGUID.NewGuid bei Verwendung unter Android / iOS nicht zwingend eine unique GUID liefert? Zumindest wenn man mehrere GUID´s auf einmal benötigt und somit den Aufruf von TGUID.NewGuid schnell hintereinander ausführt? Ich kann das eindeutig nachvollziehen, wenn ich mir z.B. 100 Guid´s generiere und mir das Ergebnis anschaue. Da gibt es Kollisionen! Hat mich ein wenig erschrocken, da es in meinen Programmen vorkommt, dass ich mal eine gewisse Anzahl von GUIDs auf einmal benötigt... Wie es scheint, sind die GUID´s unter Android / iOS auch von einer ganz anderen Version. Unter Windows ist die erste Ziffer des dritten Blocks immer eine "4".
Code:
Andy
Android GUID: F66F17BA-F4E6-E511-89B9-60F81DC7385A
Windows GUID: A38CB014-7CEE-4B23-AACF-2E8985D82691 |
AW: GUID nicht unique unter iOS / Android
Ich kenne keine Interna, aber sowas hatten wir mal bei unterschiedlichen Geräten einer Charge. Kann also offenbar sein.
Es war allerdings nicht aus TGuid. |
AW: GUID nicht unique unter iOS / Android
Ich meine der richtig Aufruf ist
Delphi-Quellcode:
createGuid(meineTGuidVar);
|
AW: GUID nicht unique unter iOS / Android
Liste der Anhänge anzeigen (Anzahl: 1)
Ohh ja doof...
Kleines Testprogramm anbei... Windows OK.. iOS Sim & Device doppelte aufeinanderfolgende GUID's Mavarik |
AW: GUID nicht unique unter iOS / Android
Zitat:
Delphi-Quellcode:
genau tut?
TGUID.NewGuid
Delphi-Quellcode:
Der eigentliche Unterschied liegt in
class function TGuidHelper.NewGuid: TGUID;
begin if CreateGUID(Result) <> S_OK then RaiseLastOSError; end;
Delphi-Quellcode:
, was vollkommen verschiedene Implemenationen unter Windows und allen Posix-Systemen hat. Kann natürlich sein, daß die Implementierung in den nicht-Windows-Systemen buggy ist. War zumindest früher schon mal der Fall:
CreateGUID
![]() |
AW: GUID nicht unique unter iOS / Android
Hmm, kann Zufall sein, hatte es nicht weiter überprüft, aber in einem iOS-Projekt lieferte TGuid.NewGuid auch doppelte IDs. Hatte dann createGuid genommen und keine Probleme mehr (?).... . Schau ich mit morgen nochmal an, nicht dass ich da eine Leiche habe...
|
AW: GUID nicht unique unter iOS / Android
Macht da jemand einen Quality-Eintrag? Das ist ja schon kritisch. Wir verwenden in unserer App auch GUIDs. Allerdings generieren wir bisher nicht mehrere direkt hintereinander.
|
AW: GUID nicht unique unter iOS / Android
Zitat:
Der UUID-Generator von Android richtet sich nach ![]() Vielleicht erzeugt Delphi einfach nur zu schnellen Code :-D Du kannst ja mal versuchen, ein
Delphi-Quellcode:
zwischen die Generierung zu setzen. Bei 100 GUIDs hast du dann eine Verzögerung von 100 ms. Das ist zwar nicht schön, aber besser als kollidierende GUIDs.
Sleep(1)
|
AW: GUID nicht unique unter iOS / Android
Zitat:
|
AW: GUID nicht unique unter iOS / Android
Das macht man aber auch nur, wenn man weiss, dass dort ein Problem bestehen kann. Und wer weiss das (außer uns paar hier) jetzt?
|
AW: GUID nicht unique unter iOS / Android
Bei mir ändert sich nur der erste Block der Guid, die folgenden 4 Blöcke sind immer identisch.
685A3F45-F8EC-E511-8447-C538D3A710A6 DAFA4045-F8EC-E511-8447-C538D3A710A6 |
AW: GUID nicht unique unter iOS / Android
Zitat:
Zitat:
|
AW: GUID nicht unique unter iOS / Android
Zitat:
|
AW: GUID nicht unique unter iOS / Android
Ich hab mir hierzu halt so etwas gebastelt:
Delphi-Quellcode:
Muss jetzt nur jedes mal, wenn ich mehr als eine GUID benötigte daran denken, über die Funktion mir die GUID´s zu holen... :(
class function TSysUtils.CreateGuidList(const ACount: Integer): IWGList<TGUID>;
{$IF DEFINED(MSWINDOWS)} var i: Integer; {$ENDIF} begin Result := TWGList<TGUID>.Create; {$IF DEFINED(iOS) or DEFINED(ANDROID)} while Result.Count < ACount do begin Sleep(5); Result.AddIfNotExists(TGUID.NewGuid); end; {$ELSE} for i := 0 to ACount-1 do Result.Add(TGUID.NewGuid); {$ENDIF} end; Ich gehe natürlich davon aus, dass irgendwann schon eine GUID kommt die noch nicht generiert wurde. Sonst macht mir die while-Schleife irgendwann ein Problem. ;) |
AW: GUID nicht unique unter iOS / Android
und was machst Du senn das Programm neu gestartet wird? Alle guid der Datenbank abfragen?
|
AW: GUID nicht unique unter iOS / Android
Zitat:
Ich hoffe einfach mal, dass 2h nach der letzten GUID nicht wieder die gleiche GUID kommt. Wenn dass der Fall sein sollte, kann ich meine App ohnehin direkt wieder löschen. ;) |
AW: GUID nicht unique unter iOS / Android
Und was ist mit Multithreading :P
Die obige implementierung gibt in 2 Threads mitunter identische/überlappende listen raus. Vllt was, was man per CriticalSection locken sollte?(Nicht unbedingt für deinen UseCase aber generell) |
AW: GUID nicht unique unter iOS / Android
Ganz blöd nur wenn man mehrere User an einer DB hängen hat. Und PKs Guids sind. Noch blöder wirds wenn man für die App Geld verlangt. Am blödsten wirds dann wenn die App auch noch genutzt wird....
Habe jetzt die offline Lauffähigkeit deaktiviert und meinem Datasnap-Server (windows 😉) ne Funktion getGuid spendiert.... :duck::wall: |
AW: GUID nicht unique unter iOS / Android
Zitat:
Auch die Tatsache, dass mehrere Benutzer gleichzeitig meine App verwenden und dann Daten in eine zentrale Datenbank synchronisieren ist nicht gerade angenehm. Edit: Glaube mehrere Geräte ist doch kein Problem, da der restliche Teil der GUID (die nicht-Zeit) ja auf Basis der Mac-Adresse generiert wird. Will eigentlich nicht die GUID vom Server generieren müssen. Diese Aufrufe würde ich mir gerne sparen. |
AW: GUID nicht unique unter iOS / Android
Indirekt kann man doch durch den Bug Rückschlüsse auf das Gerät ziehen. Vorallem weiss ich jetzt welche User sich Geräte teilen oder mehrere Geräte haben... Ist das Datenschutzmäsdig erlaubt? Egal ob man das auswertet oder nicht.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 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