Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PINs erzeugen und vergleichen (https://www.delphipraxis.net/142335-pins-erzeugen-und-vergleichen.html)

ickehausen 26. Okt 2009 14:43


PINs erzeugen und vergleichen
 
Hallo,

ich möchte PINs, deren Länge und Anzahl ich frei bestimmen kann, erzeugen und anschließend vergleichen, damit kein PIN zweimal vorkommt.
Das Erzeugen ist schon erledigt. Aber wie vergleiche ich die PINs am besten. Wenn ich sie in ein dyn.Array schreibe, wird das Array dann nicht zu groß, wenn ich einige tausend PINs erzeuge?
Wie gehe ich am elegantesten an die Sache?

Hier der Code, mit dem ich die PINs erzeuge und in eine PIN-Liste (Text_Datei) schreibe:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

function RandPW(iPWLen: Integer): String;
var
  sPW: string;
begin
  sPW := 'abcdefghijklmnopqrstuvwxyz123456789';
  Result := '';
  repeat
    Result := Result + sPW[Random(Length(sPW)) + 1];
  until
    (Length(Result) = iPWLen);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Speicherort.Execute then
  begin
    AssignFile(Text_Datei,Speicherort.FileName);
    ReWrite(Text_Datei);
    for i := 1 to StrToInt(EditAnzahl.Text) do
      begin
        PIN := RandPW(StrToInt(EditLaenge.Text));
        WriteLn(Text_Datei, PIN);
      end;
    CloseFile(Text_Datei);
    StatusBar1.Panels[0].Text := 'Pins sind erzeugt!';
  end;
end;

end.

OldGrumpy 26. Okt 2009 15:00

Re: PINs erzeugen und vergleichen
 
Am bequemsten wäre da sicherlich eine TStringList, die hat ein paar Eigenschaften die man nur passend setzen muss, dann wird das Hinzufügen von bereits in der Liste enthaltenen Elementen entweder mit oder ohne Exception verweigert. Im Prinzip müsstest Du dann nur noch die Erzeugung durchlaufen lassen bis die Stringlist dann ausreichend viele Elemente enthält (also die gewünschte Anzahl eindeutiger PINs erzeugt wurde). Kleiner Nachteil: Damit der Doublettencheck funktioniert, muss die Eigenschaft "Sorted" auf true gestellt sein, d.h. Deine PIN-Liste ist danach standardmäßig aufsteigend sortiert. Wenn das kein Problem ist, dürfte das die schnellste Lösung sein: ca. 5 Minuten Hilfe zu TStringList lesen und nochmal 5 Minuten für die Implementierung.

Was die Performance angeht, kann ich nur sagen: Ausprobieren. Bei ein paar tausend Lines dürfte das aber noch nicht so dramatisch ins Gewicht fallen.

alzaimar 26. Okt 2009 15:05

Re: PINs erzeugen und vergleichen
 
Du könntest eine Hashmap verwenden, um zu prüfen, ob eine PIN (eigentlich ja ein Kennwort, denn eine PIN ist eine Persönliche Identifikations Nummer, während ein Pin eine Nadel ist) bereits erzeugt wurde.

Hier werden verschiedene Suchverfahren verglichen: Dabei werden mehrere Millionen Einträge gemacht: Mach Dir also keine Gedanken wegen ein paar Tausend.

himitsu 26. Okt 2009 15:22

Re: PINs erzeugen und vergleichen
 
Wenn du es über die Datei machen willst, dann mußt du vor dem Einfügen eines neuen OINs erstmal alle vorherigen Einträge der Datei prüfen, ob dieser schon existiert.

Ich geh mal davon auß, daß deine kleine List nicht gleich den RAM vollmacht,
also wäre hier eine StringList wirklich einfacher.

Hier könnte man grundsätzlich erstmal genauso vorgehn
und erstmal nachsehn, ob der "neue" PIN schon vorhanden ist,
aber hier lassen sich auch ganz praktisch einige Funktionen der TStringList verwenden.


Also Sortieren und beim Einfügen Dupplikate ignorieren lassen
und dann die Schleife so oft durchlaufen lassen, bis .Count deiner Anzahl entspricht.

Die Liste groß zu optimieren lohnt sich eh nicht, oder willst du dieses sehr oft machen?
Außerdem ist die Funktion RandPW auch nicht grad die Optimalste, also was soll's. :stupid:

ickehausen 26. Okt 2009 16:48

Re: PINs erzeugen und vergleichen
 
Danke für Eure Antworten.
Ich werde es wohl mit der StringList versuchen.

At alzaimar: Ich bin leider Delphi-Amateur und verstehe Deine Vorschlag mit der HAshmap nicht. Ich bin froh, wenn ich das mit der StringList hin bekomme, aber trotzdem vielen Dank!!!

alzaimar 26. Okt 2009 17:04

Re: PINs erzeugen und vergleichen
 
Hi ickehausen,

mit einer TStringList geht das genauso gut, wäre aber langsamer. Probier's mal und wenn Du nicht weiterkommst, frag einfach. Dazu ist so ein Forum schließlich da.

PS: Eine Hashmap ist einfach nur ein fürchterlich schneller Such-Und-Find-O-Mat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 Uhr.

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