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.
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.
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.
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).
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.
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.
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)?
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.
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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