Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ID erstellen/berechnen (https://www.delphipraxis.net/43635-id-erstellen-berechnen.html)

xineohp 6. Apr 2005 17:26


ID erstellen/berechnen
 
hi,

ich brauche eine größere Anzahl (1000-5000) eindeutige IDentifikations-Nummern. Zusätzlich soll aus jeder beliebigen Kombination dieser ID-Nummern wiederum eine eindeutige ID entstehen, die diese Kombination kennzeichnet.

Im Prinzip entspricht dieses Verhalten genau dem von (Windows-)Flags (z.B. die Dateiattribut-Flags) allerdings basieren diese Flags auf den 2er Potenzen und ist somit eigentlich nur für kleinere Mengen (~50) geeignet, da 2^1000 doch ziemlich groß ist :roll:

Ich hoffe das jemand von euch eine passende Idee hat, wie man dieses Problem elegant lösen kann.

trifid 6. Apr 2005 21:57

Re: ID erstellen/berechnen
 
Zitat:

ich brauche eine größere Anzahl (1000-5000) eindeutige IDentifikations-Nummern.
Zusätzlich soll aus jeder beliebigen Kombination dieser ID-Nummern wiederum eine eindeutige ID entstehen, die diese Kombination kennzeichnet.
wenn eine ID1 eine ID2 zwei beschreiben kann, ist dann nicht die ID2 überflüssig?

Zitat:

Im Prinzip entspricht dieses Verhalten genau dem von (Windows-)Flags (z.B. die Dateiattribut-Flags)
wusste noch gar nicht dass mein Windows über 1000 FileAttribs hergeben kann :wink:

Zitat:

allerdings basieren diese Flags auf den 2er Potenzen und ist somit eigentlich nur für kleinere Mengen (~50) geeignet, da 2^1000 doch ziemlich groß ist
kannst du auch ein ein größeres Zahlensystem wie z.B. hexadezimal verwenden?

kannst du näher schildern um was es überhaupt geht

marabu 6. Apr 2005 22:16

Re: ID erstellen/berechnen
 
5000 Bits sind noch kein Problem, denke ich. Nimm einfach einen Bitvektor z.B. Classes.TBits (D7)

eddy 7. Apr 2005 11:15

Re: ID erstellen/berechnen
 
Hallo xineohp,

wenn es was mit Datenbanken zu tun hat, kannst Du ftAutoInc nutzen, wenn nicht mußt Du Dir den letzt verwendeten Wert merken. Int64 sollte für die meisten Datenmengen ausreichen zur eindeutigen Identifizierung. Im schlimmsten Fall kannst Du aus ID1 und ID2 eine Zeichenkette mit konstanter Länge bilden und diese hintereinandersetzen. Sollte auch etwas eineindeutiges ergeben.

Programmiervorschläge kann ich erst machen, wenn ich weiß worum es geht.

mfg
eddy

opfer.der.genauigkeit 7. Apr 2005 11:33

Re: ID erstellen/berechnen
 
Hi,

du kannst auch deine ID per CoCreateGuid erzeugen.
Dann hast du GUIDs, was die Wahrscheinlichkeit einer Redundanz ziemlich unrealistisch macht. ;)

xineohp 7. Apr 2005 13:01

Re: ID erstellen/berechnen
 
hm,

hätte nicht gedacht, dass ich so schwer zu verstehen bin ... aber egal, ich werde noch mal verdeutlichen was ich meine:

angenommen ich habe fünf verschiedene Dateien, denen ich jeweils eine eindeutige ID zuordne:

Code:
Datei 1: ID1 = 1  = 2^0
Datei 2: ID2 = 2  = 2^1
Datei 3: ID3 = 4  = 2^2
Datei 4: ID4 = 8  = 2^3
Datei 5: ID5 = 16 = 2^4
Dann kann ich aus jeder beliebigen Kombination (das scheinen einige überlesen zu haben :gruebel:) wiederum eine eindeutige ID errechnen:

Datei 1 & Datei 2 & Datei 3: ID = ID1 + ID2 + ID3 = 1 + 2 + 4 = 7 (Diese ID kann ausschließlich durch diese eine Kombination erzielt werden!)

Datei 1 & Datei 3 & Datei 5: ID = ID1 + ID3 + ID5 = 1 + 4 + 16 = 21
Datei 3 & Datei 5 & Datei 1: ID = ID3 + ID5 + ID1 = 4 + 16 + 1 = 21 (Die Reihenfolge spielt dabei keine Rolle)

Und dies ist genau das Prinzip, nachdem die diversen Windowsflags funktionieren.
Allerdings funktioniert dieses Prinzip nur bei kleineren ID-Anzahlen, da die Potenzen von Zwei sehr schnell sehr groß werden.



Die einzige Antwort, die auch nur im entferntesten passt ist die von marabu, allerdings kann ich mir nicht vorstellen, wie ich das umsetzen könnte. Ich wäre für ein Beispiel dankbar.

Jelly 7. Apr 2005 13:07

Re: ID erstellen/berechnen
 
Wenn du für 5000 verschiedene Attribute alle möglichen Kombinationen eindeutig in einer ID speichern willst, bist du mit Integer o.ä. Typen komplett verloren, denn dafür muss du 2^5000 verschiedene IDs erzeugen können, und das ist ne Menge. Es bleibt dir also nix anderes übrig, als eine Klasse zu schreiben, wo du nicht deine ID direkt speicherst, sondern eben jedes einzelne Bit getrennt. Als Bit-Typ kannst du z.B. Boolean nehmen. Die einzelnen Bits kannst du in einem dynamischen array speichern.

Dann musst du wohl auch noch AND und OR in der Klasse einbauen. Das sollte aber nicht das Problem sein, da dir ja jedes einzelne Bit in einer getrennten Variable vorliegt.

marabu 7. Apr 2005 13:20

Re: ID erstellen/berechnen
 
Zitat:

Zitat von xineohp
Die einzige Antwort, die auch nur im entferntesten passt ist die von marabu, allerdings kann ich mir nicht vorstellen, wie ich das umsetzen könnte. Ich wäre für ein Beispiel dankbar.

Delphi-Quellcode:
uses
  Classes;
var
  bits: TBits;
begin
  bits.size := 5000; // wieviele bits willst du verwalten?
  bits[n] := true;  // bit einschalten
  bits[n] := false; // bit ausschalten
  if bits[n] then {} else {};
end;

xineohp 7. Apr 2005 13:23

Re: ID erstellen/berechnen
 
hm,

@Jelly
genau das(eine extra Klasse) wollte ich eigentlich vermeiden, da ich dann meine IDs erzeugen und freigeben müsste und zusätzlich das Kopieren auch nicht so trivial ist, da ich mich in verschiedenen Threads bewege.

Ich glaube ich entscheide mich für eine billig Lösung:
Die primären IDs sind einfach Zahlen von 1 bis 5000 und die Kombinationen identifiziere ich, indem ich die enthltenen ID der Größe nach sortiert in einen String schreibe.

@marabu
Vielen Dank. Allerdings ist tBits auch eine Klasse, womit die obengenannten Probleme auftreten.

Jelly 7. Apr 2005 13:26

Re: ID erstellen/berechnen
 
Zitat:

Zitat von xineohp
Die primären IDs sind einfach Zahlen von 1 bis 5000 und die Kombinationen identifiziere ich, indem ich die enthltenen ID der Größe nach sortiert in einen String schreibe.

Naja, wenn du eine Kombination von 5000 IDs in ein String schreibst, belegst du somit 25MB Speicher...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr.
Seite 1 von 2  1 2      

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