Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Eindeutige ID aus einem String berechnen (https://www.delphipraxis.net/200435-eindeutige-id-aus-einem-string-berechnen.html)

Bünni 19. Apr 2019 00:37


Eindeutige ID aus einem String berechnen
 
Für die Lösung eines Problems benötige ich demnächst vermutlich etwas wie eine eindeutige ID, welche ich aus einem gegebenem String berechnen kann, der ohnehin schon eindeutig ist und nur einmal vorkommen kann. Die ID benötige ich aus diversen Gründen zusätzlich.

Die ID sollte wenn möglich nicht so lang sein wie MD5. Welche Möglichkeiten bleiben mir da noch? Mir stehen dafür unter anderem die Wolfgang Ehrhardt Komponenten zur Verfügung.

Ich habe gerade CRC32 getestet. Aber ist das eindeutig genug?
Delphi-Quellcode:
function CRC32String(const Text: string): string;
var
 i: Integer;
 TextLen: Word;
 buf: array [0 .. 4095] of Byte;
 CRC: LongInt;
 ctx: TCRC_ctx;
begin
 TextLen := Length(Text);
 for i := 1 to TextLen do
  buf[i - 1] := Byte(Text[i]);

 cm_Create(CRC32_Zip, nil, ctx);
 cm_Full(ctx, CRC, @buf, TextLen);

 Result := IntToHex(CRC, 8);
end;

hoika 19. Apr 2019 02:48

AW: Eindeutige ID aus einem String berechnen
 
Hallo,
wenn es ein kann ist, nimm eine GUID und lass den arnen String in Ruhe.

Bünni 19. Apr 2019 02:51

AW: Eindeutige ID aus einem String berechnen
 
Meinst du damit GUID := System.SysUtils.StringToGUID('test') ?

Laut fandom funktioniert das nur mit Strings im GUID Format
https://delphi.fandom.com/wiki/StringToGUID_Routine

TigerLilly 19. Apr 2019 09:31

AW: Eindeutige ID aus einem String berechnen
 
CRC ist eine Kontrollsumme, die es dir erlaubt, zu prüfen, ob ein String verändert wurde. CRCs sind nicht eindeutig, soll heißen, unterschiedliche Strings können gleiche CRCs haben.

Eine Hash-Funktion wäre eine Möglichkeit, aber da kann es auch zu Kollisionen kommen.

Du kannst ein Lexikon anlegen + deine Strings nummerieren.
Du kannst die Zahlenwerte der Zeichen nehmen und so eine Zahl erzeugen, die ist eindeutig (sogar eineindeutig, weil umkehrbar).

Was magst denn machen, mit den IDs + was sind denn das für Strings?

peterbelow 19. Apr 2019 09:36

AW: Eindeutige ID aus einem String berechnen
 
Zitat:

Zitat von Bünni (Beitrag 1430604)
Für die Lösung eines Problems benötige ich demnächst vermutlich etwas wie eine eindeutige ID, welche ich aus einem gegebenem String berechnen kann, der ohnehin schon eindeutig ist und nur einmal vorkommen kann. Die ID benötige ich aus diversen Gründen zusätzlich.

Die ID sollte wenn möglich nicht so lang sein wie MD5. Welche Möglichkeiten bleiben mir da noch? Mir stehen dafür unter anderem die Wolfgang Ehrhardt Komponenten zur Verfügung.

Ich habe gerade CRC32 getestet. Aber ist das eindeutig genug?

Nein, definitiv nicht. Egal wie Du die ID berechnest, wenn sie kürzer ist als der Ursprungsstring kannst Du nie garantieren, das die erhaltene ID nicht auch aus einem anderen Input resultieren könnte. Das ist auch der Grund, wieso man bei Datenstrukturen, die einen aus einem String oder anderen Daten berechneten Hash-Wert als Schlüssel benutzen, den Orginalwert immer mit ablegen muss, damit man später solche Kollisionen erkennen kann.

Man kann zwar (theoretisch) für jeden gegebenen Satz von Strings ein Hash-Funktion finden, die innerhalb dieses Satzes für jeden der Strings einen eindeutigen Wert liefert, aber halt garantiert nur für Strings in dem vorgegebenen Satz, nicht für andere.

Wozu brauchst Du denn die ID, und muss sie unbedingt aus dem String berechnet sein? Wenn beides eigentlich voneinander unabhängig ist und Du nur eine eindeutige ID brauchst ist eine GUID keine schlechte Wahl.

Klaus01 19. Apr 2019 09:47

AW: Eindeutige ID aus einem String berechnen
 
.. von wievielen Strings sprechen wir denn hier?

was zum Lesen: https://ethblog.de/wie-funktioniert-hashing/
https://arstechnica.com/civis/viewtopic.php?t=149670

eine GUID ist nicht wesentlich kürzer als z.B. ein MD5 Hash

Grüße
Klaus

Bünni 19. Apr 2019 11:12

AW: Eindeutige ID aus einem String berechnen
 
Ich brauche diese ID leider. MD5 und andere Hashes sind zu lang, da ich sonst Probleme mit zu langen Pfaden im Dateisystem bekommen könnte (nicht sicher).
Anders als aus einem String kann ich die ID auch nicht berechnen, da ich nur den String als Basisinformation habe.

Anhand des Strings wird ein Verzeichnis angelegt. Der String wird vorher aber bereinigt und unzulässige Zeichen und andere besondere Zeichen entfernt.
Es gibt Konstellationen, da bleibt am Ende das gleiche Ergebnis übrig. Deswegen würde ich gerne eine ID hinten dranhängen.

Eine GUID würde ich gerne vermeiden da man so nie weiß welches Verzeichnis mit welcher GUID zu welchem Datensatz gehört.

FaTaLGuiLLoTiNe 19. Apr 2019 11:19

AW: Eindeutige ID aus einem String berechnen
 
Kannst du nicht einfach laufende Nummern verwenden und dir irgendwo ein Verzeichnis anlegen, in dem du dir die Zuordnung von String zu Nummer (= Name des Ordners) merkst?

Bünni 19. Apr 2019 11:26

AW: Eindeutige ID aus einem String berechnen
 
Jeder Datensatz hat intern einen Index, der sich aber bei jedem Programmstart ändern kann je nachdem, ob die Daten verändert wurden oder nicht. Im Normalfall ist davon auszugehen, dass sich die Daten bei jeder Sitzung mindestens einmal stark ändern. Leider nicht möglich mit einem Index.

Eine GUID wäre eventuell eine Lösung, wenn ich sie auch für jeden Datensatz in der Konfigurationsdatei mit ablege.
Aber wie berechnet man eine korrekt formatierte GUID aus einem String?

Schokohase 19. Apr 2019 11:41

AW: Eindeutige ID aus einem String berechnen
 
Ob der MD5 HashWert in der Darstellung zu lang wird, hat doch nur etwas mit der Art der Darstellung zu tun.

Ein MD5-HashWert hat 128-bit. Diesen kann man Hexadezimal darstellen und erhält 32 Zeichen.
Code:
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Zu lang? Dann hätten wir da noch eine Base64-Darstellung und erhalten von dem gleichen Wert
Code:
/////////////////////w==
also 24 Zeichen (bzw. 22 denn die letzten beiden sind in diesem Falle immer gleich).

Also, wie lang darf die errechnete ID aus dem String denn nun sein?

PS: Wer jetzt einwenden möchte, dass in dem Base64 Zeichen vorkommen, die in einem Pfad nicht vorkommen dürfen, der hat Recht und ich überlasse es jedem selber dieses mit etwas Fantasie selber zu lösen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.
Seite 1 von 4  1 23     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz