Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Für alle möglichen Kombinationen Datei und MD5 Hash erzeugen
flo87
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

Für alle möglichen Kombinationen Datei und MD5 Hash erzeugen

beantworten | zitieren | melden

Liebes Forum, ich bin ein Hobbyprogrammierer, der immer mal wieder kleinere Alltagsprobleme aus Interesse und zur Zeitersparnis programmiertechnisch umsetzen möchte.

Ausgangslage:
Ich habe mehrere Change-Dateien, die jeweils einige Offsets einer Datei ändern. Diese Dateien stehen als Ressource im Projekt zur Verfügung:

byte[][] change = new byte[9][];
change[0] = Properties.Resources.change0;
change[1] = Properties.Resources.change1;
change[2] = Properties.Resources.change2;
change[3] = Properties.Resources.change3;
...

Ob ein Change angewendet wird, wird über Checkboxen in der Form vom Anwender ausgewählt. D. h. es gibt 20x Changes zur Auswahl mit jeweils 2 Zuständen (Change anwenden, Change nicht anwenden)
Change 1
[ ] nicht anwenden | [x] anwenden
Change 2
[x] nicht anwenden | [ ] anwenden
Change 3
[ ] nicht anwenden | [x] anwenden
...

Zum Anwenden dieser Changes gibt es bereits eine Methode, die auch funktioniert:

ApplyChange(textBoxPath.Text, 0); // textBoxPath.Text ist die Zieldatei, auf die der Change angewendet wird | "0" die ChangeNummer

Ich benötige nun eine Methode, die jeweils alle möglichen Kombinationen anwendet sowie jeweils eine Datei und deren MD5 erzeugt. Mit diesen MD5-Werten möchte ich später gegenprüfen, ob die Changes korrekt angewendet wurden.
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von flo87 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3946

beantworten | zitieren | melden

Hallo,

ist dir klar, daß du dann 2^20 = 1048576 Dateien erzeugst?
Technisch entspricht das dann 20 verschachtelten Schleifen mit jeweils den Werten 0 (false) und 1 (true) - oder alternativ per Rekursion.
private Nachricht | Beiträge des Benutzers
flo87
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Danke schon mal für diesen Hinweis, das war mir nicht bewusst. Die genannten 20 wäre die maximale Ausbaustufe - es sind aktuell weniger, aber trotzdem zeigt dein Beispiel wie schnell exponentiell die Anzahl wächst.

Dann ist es wahrscheinlich cleverer die MD5s im Speicher zu erzeugen. Das bekomme ich wahrscheinlich irgendwie hin, aber die Schleife nicht.
Hauptziel ist, die MD5s zu erzeugen, um diese im Programm zu hinterlegen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von flo87 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3946

beantworten | zitieren | melden

Warum willst du denn im voraus alle Kombinationen erzeugen? Reicht es nicht, nur für die vom Anwender gewählte Kombination die "Changes" durchzuführen (und per MD5 gegenzuchecken).
private Nachricht | Beiträge des Benutzers
flo87
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Wenn die MD5s im Programm nicht hinterlegt sind, wie soll das Programm überprüfen, ob die Zieldatei korrekt erzeugt wurde?

Ich möchte alle Kombinationen vorab als MD5 erzeugen und hinterlegen, um das sicherzustellen.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1766
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Bei der Menge an Dateien würde dis keinen Sinn machen, diese alle vorab erzeugen zu lassen.
Vermutlich verheizt du dann einige Zeit mit voller CPU Last.
Je nach Große der Dateien dürfte dann auch noch die Festplatte, falls du eine dafür verwendest, limitieren.
Hier sollten die Hashes erst erzeugt werden, wenn diese auch benötigt werden.

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3946

beantworten | zitieren | melden

Wäre es statt der MD5 dann nicht einfacher, nach dem Ändern der Zieldatei diese an den Offsets noch mal auszulesen und die Änderung abzutesten (wie es auch viele Kopierprogramme mittels Verifikation machen)?
private Nachricht | Beiträge des Benutzers
flo87
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Ich kann der Argumentation folgen, würde aber trotzdem gerne eine programmiertechnische Lösung sehen, die von allen möglichen Kombinationen den MD5-Wert ermittelt.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15507
Herkunft: BW

beantworten | zitieren | melden

Programmtiertechnisch würde man das nie machen, weil es enorme Ressourcen kostet.
Zudem ist MD5 vergleichweise anfällig und langsam.

Gerade für Datei-Hashwerte gibt es viel bessere Verfahren - wenn man überhaupt Hashen muss.
Empfehlung und Erfahrungswerte für Hash-Verfahren - Wie grosse Dateien vernünftig Hashen?

Ansonsten sind das eben stupide 20 verschachtelte Schleifen, wie es ja schon genannt wurde.
Wir werden Dir aber nicht den Code dafür schreiben, bezogen auf die Formulierung, dass Du "eine Lösung sehen willst".
Das Forum ist kein Lösungs- oder Code-Generator.

Alternativ musst eben sagen, wo Du genau hängst, damit man Dich in die richtige Richtung schubsen kann.
Ausprogrammieren musst es aber selbst.
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 232
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Hallo flo87,

ich würde einen Integer-Datentyp (mit passender Größe) und eine einfache for-Schleife verwenden:

		int requiredBits = 20;
		uint maxValue = 1u << requiredBits;
		for (uint register = 0; register < maxValue; register++)
		{
			bool bit1 = (register & 1) != 0;
			bool bit2 = (register & 2) != 0;
			bool bit3 = (register & 4) != 0;
			bool bit4 = (register & 8) != 0;
			// ...
		}

Mit dieser wird jede mögliche Kombination exakt einmal durchlaufen. Du musst lediglich die einzelnen Bits an deinen weiteren Algorithmus anbinden.

Grüße
spooky
private Nachricht | Beiträge des Benutzers