Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   GUID nicht unique unter iOS / Android (https://www.delphipraxis.net/188584-guid-nicht-unique-unter-ios-android.html)

AndyDF 17. Mär 2016 14:32

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:
Android GUID: F66F17BA-F4E6-E511-89B9-60F81DC7385A
Windows GUID: A38CB014-7CEE-4B23-AACF-2E8985D82691
Andy

jobo 17. Mär 2016 14:49

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.

Darlo 17. Mär 2016 18:06

AW: GUID nicht unique unter iOS / Android
 
Ich meine der richtig Aufruf ist
Delphi-Quellcode:
createGuid(meineTGuidVar);

Mavarik 17. Mär 2016 18:19

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

Uwe Raabe 17. Mär 2016 18:45

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von Darlo (Beitrag 1333221)
Ich meine der richtig Aufruf ist
Delphi-Quellcode:
createGuid(meineTGuidVar);

Hast du schon mal nachgesehen, was
Delphi-Quellcode:
TGUID.NewGuid
genau tut?

Delphi-Quellcode:
class function TGuidHelper.NewGuid: TGUID;
begin
  if CreateGUID(Result) <> S_OK then
    RaiseLastOSError;
end;
Der eigentliche Unterschied liegt in
Delphi-Quellcode:
CreateGUID
, 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: #150 uuid_generate_time generates duplicate UUIDs

Darlo 17. Mär 2016 19:23

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...

bra 18. Mär 2016 08:42

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.

Uwe Raabe 18. Mär 2016 10:13

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von bra (Beitrag 1333251)
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.

Ich bin mir gar nicht sicher, daß der Fehler tatsächlich im Delphi steckt und damit dort überhaupt behoben werden kann. Delphi ruft in allen Fällen eine externe Bibliothek des Betriebssystems auf. Wenn der Fehler dort liegt, hat man kaum eine Chance das zu umgehen. Selbst wenn das in einer Version x dieser Bibliothek gefixt ist, kann man ja noch nicht mal davon ausgehen, daß auf dem Zielgerät auch diese Version im Einsatz ist.

Der UUID-Generator von Android richtet sich nach RFC 4122, der geht intern von einer Auflösung der Systemzeit von 100 ns aus. Werden innerhalb dieser 100 ns aber weiter UUIDs generiert, kommt es per Definition schon zu Kollisionen, die vom Algorithmus abgefangen werden sollten.

Vielleicht erzeugt Delphi einfach nur zu schnellen Code :-D

Du kannst ja mal versuchen, ein
Delphi-Quellcode:
Sleep(1)
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.

Mavarik 18. Mär 2016 10:20

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1333261)
Du kannst ja mal versuchen, ein
Delphi-Quellcode:
Sleep(1)
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.

Oder einfach das letzte GUID zwischen speichern und nur bei Gleichheit einfach kurz warten und dann nochmal die Routine aufrufen...

bra 18. Mär 2016 10:33

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?

Darlo 18. Mär 2016 10:59

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

mjustin 18. Mär 2016 11:02

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1333261)
Vielleicht erzeugt Delphi einfach nur zu schnellen Code :-D

Du kannst ja mal versuchen, ein
Delphi-Quellcode:
Sleep(1)
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.

Der RFC behandelt den Fall "zu schneller" Aufrufe innerhalb eines System Time Intervals mit einer "Muss"-Anforderung:

Zitat:

If a system overruns the generator by requesting too many UUIDs
within a single system time interval, the UUID service MUST either
return an error, or stall the UUID generator until the system clock
catches up.
Entweder der Generator ist nicht RFC-compliant (das ist eher unwahrscheinlich) oder der Fehler liegt woanders.

Luckie 18. Mär 2016 15:16

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von bra (Beitrag 1333268)
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?

Das wäre ein gutes Beispiel, wo ein Kommentar im Quellcode sinnvoll ist, damit der nächster Programmierer weiß, warum man das Sleep eingebaut hast.

AndyDF 18. Mär 2016 15:25

AW: GUID nicht unique unter iOS / Android
 
Ich hab mir hierzu halt so etwas gebastelt:

Delphi-Quellcode:
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;
Muss jetzt nur jedes mal, wenn ich mehr als eine GUID benötigte daran denken, über die Funktion mir die GUID´s zu holen... :(

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. ;)

Darlo 18. Mär 2016 15:57

AW: GUID nicht unique unter iOS / Android
 
und was machst Du senn das Programm neu gestartet wird? Alle guid der Datenbank abfragen?

AndyDF 18. Mär 2016 16:07

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von Darlo (Beitrag 1333306)
und was machst Du senn das Programm neu gestartet wird? Alle guid der Datenbank abfragen?

Durch Tests bin ich darauf gekommen, dass es wohl an der Zeit liegt. Und Kollisionen nur entstehen, wenn sehr kurz hintereinander GUID generiert werden.
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. ;)

Memnarch 18. Mär 2016 18:03

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)

Darlo 18. Mär 2016 20:31

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:

AndyDF 19. Mär 2016 09:00

AW: GUID nicht unique unter iOS / Android
 
Zitat:

Zitat von Memnarch (Beitrag 1333310)
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)

Ja. Blöd. :(
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.

Darlo 20. Mär 2016 13:36

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