Laden...

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

Erstellt von flo87 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.669 Views
F
flo87 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren
Für alle möglichen Kombinationen Datei und MD5 Hash erzeugen

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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.

F
flo87 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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

F
flo87 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

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.

T
2.219 Beiträge seit 2008
vor 4 Jahren

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.

4.931 Beiträge seit 2008
vor 4 Jahren

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)?

F
flo87 Themenstarter:in
4 Beiträge seit 2019
vor 4 Jahren

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.

16.807 Beiträge seit 2008
vor 4 Jahren

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.

S
248 Beiträge seit 2008
vor 4 Jahren

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