ich bin neu hier im Forum und benötige Hilfe bei einem Problem, dass mich schon seit einigen Wochen beschäftigt.
Ich habe unter Linux ein kleines Brute-Force Programm in C geschrieben. Es ist nichts besonderes und nur zur Übung.
Das Programm funktioniert auch soweit ganz gut. Vor ca. zwei Wochen kam ich dann auf die Idee, einen Zähler zu
implementieren. Also die Idee ist, dass jeder generierte String gezählt werden soll. So das am Ende, unabhängig davon
ob ein Treffer gelandet wurde oder nicht, angezeigt wird wie viele Strings erzeugt wurden.
Der Zähler ist eine ganz normale Integer-Variable die nach jedem generierten String inkrementiert wird.
Also
Code: Alles auswählen
Hier mal grob der Aufbau (!!!also nicht vollständig!!!)
/* Globale Variablen */
const char LiteralsLower[] = "abcdefghijklmnopqrstuvwxyz" //z.B. nur Kleinbuchstaben
int NLiterals = sizeof( LiteralsLower ) -1; // entspricht genau 26
int main()
{
int Count; // Zähler
#pragma omp parallel default( none ) shared ( ... ) reduction( +: Count )
{
... Aufgaben ....
#pragma omp for schedule( dynamic )
for( ... )
{
...Aufgaben ...
BruteForceFunktion( ..., ..., &Count ) // Hier wird u.a. Count als Argument an einen Zeiger übergeben, der das Zählen innerhalb der BF()-Funktion übernimmt
}
}
/* nach jedem generierten String innerhalb der BF()-Funktion */
++*CountPtr; // Zähler inkrementieren
Code: Alles auswählen
Die Strings werden folgendermaßen generiert:
--------------------------------------------------------------
String | Index | Count
"a'" 1 1
"b" 2 2
"c" 3 3
.
.
.
"z" 26 26
"aa" 27 27
"ab" 28 28
.
usw.

Nicht aber, wenn das Ganze parallelisiert abläuft. Den das Ganze geschieht innerhalb eines parallelisierten Blocks mittels OpenMP.
Am Ende stimmt die Zählung nur dann wenn eben kein Treffer gelandet wurde. Da somit der parallelisierte Block erst verlassen wird,
wenn die Arbeit bis zum Ende getan wurde. Bei einem Treffer springt man eben raus. Dadurch kann die Reduction nicht vollendet werden.
Habe wirklich tausend verschiedene Dinge ausprobiert. Mit mutexen oder mit omp atomic, flush usw. Sorry das ich das nicht so detailliert beschreibe.
Aber ich habe wirklich alles mögliche versucht und die Zählung funktioniert so einfach nicht. Eben weil bei einem Treffer die Arbeit innerhalb des
parallelisierten Bereichs nicht bis zur Vollendung läuft.
Daher meine Frage an euch, gibt es eine Möglichkeit, wenn der gesuchte String gefunden wurde, den Index rückwirkend zu bestimmen?
Nehmen wir mal "test" als Beispiel. Also "test" ist der zu suchende String. "test" hat z.B. den Index '355414'. So wie "a" den Index '1' hat,
"z" den Index '26' und "aa" den Index '27' usw. Klar, wenn man anstatt
Code: Alles auswählen
const char LiteralsLower[] = "abcdefghijklmnopqrstuvwxyz"
Code: Alles auswählen
const char LiteralsLowerDigits[] = "abcdefghijklmnopqrstuvwxyz0123456789"
Aber bleiben wir einfach mal bei LiteralsLower[] = "a...z" = 26.
Wäre es irgendwie möglich durch eine bestimmte Rechenformel den Index von "test" (355414) rückwirkend zu bestimmen? Z.B. anhand der String-Länge, NLiteralsLower = 26 usw.?
Ich hoffe ich konnte mein Anliegen relativ gut beschreiben.

Würde mich über Antworten sehr freuen.
Grüße
DaveX