Hallo
Leider komme ich hier nicht sehr weit ich, wollte fragen ob ihr mir helfen könnt.
Ich würde mich sehr freuen, da ich wirklich nicht weiß wie ich weitervorgehen soll
Implementieren Sie hier die Klasse AppendOrHashThread (siehe Vorlage: ha03/src/main/java/AppendOrHashThread.java).
Betrachten Sie dazu auch die Klassen Hasher (siehe Vorlage: ha03/src/main/java/Hasher.java) und Data (siehe Vorlage: ha03/src/main/java/Data.java), sowie die Klasse Main (siehe Vorlage: ha03/src/main/Main.java).
Implementieren Sie mittels dieser Klasse einen Thread, der eine ID (Typ String) als Attribut hat. Außerdem hat die Klasse ein Attribut nextThread vom Typ AppendOrHashThread. Der Thread soll seine ID an die statische Referenz word (Data.java) ranhängen oder aber word mittels Hasher.hash() hashen. Wurde word gehashed soll ebenfalls die statische Referenz currentIterations inkrementiert werden. Threads des Typs AppendOrHashThread sollen in einer festen Reihenfolge ausgeführt werden: zuerst zwei Threads die ihre ID an word ranhängen (append) gefolgt von einem Thread der word hashed. Nachdem das word gehashed wurde soll eine neue Iteration beginnen.
Ein Wort wird in einer Iteration jeweils um die ID von t1 und t2 erweitert, indem die IDs beider Threads mit dem Wort konkateniert werden. Dabei ist streng zu beachten, dass zuerst die ID von t1 und dann die ID von t2 an das Wort gehangen wird. Bevor eine neue Iteration beginnt, wird das Wort mit den IDs der Threads in einem eigenen Thread t3 gehashed (nutzen Sie dazu Hasher.hash() aus der Vorlage).
Beispiel:
Sei word="", t1="A" und t2="B"
Dann passiert folgendes in Iteration 1:
t1 wird ausgeführt -> word="A"
t2 wird ausgeführt -> word="A" + "B"
t3 wird ausgeführt -> word=Hasher.hash(word)
In Iteration 2 wird dann wie folgt weiter gemacht:
t1 wird ausgeführt -> word=Hasher.hash(word)+"A"
t2 wird ausgeführt -> word=Hasher.hash(word)+"A" + "B" // * word wie in t3 aus 1. Iteration
t3 wird ausgeführt -> word=Hasher.word(Hasher.hash(word)+"A" + "B") // * word wie in t3 aus 1. Iteration
usw ...
Dieser Ablauf soll numOfIterations-mal (siehe Data.java) ausgeführt werden.
Beispiel:
Test Result
Main.test("A", "B"); fa2551a2e3d3924217fa85ab99413e54
Main.test(null, null); c50f3cfb68b1f71cefc732b2bca5e4a0
Klasse Data
Mein Code
Leider komme ich hier nicht sehr weit ich, wollte fragen ob ihr mir helfen könnt.
Ich würde mich sehr freuen, da ich wirklich nicht weiß wie ich weitervorgehen soll
Implementieren Sie hier die Klasse AppendOrHashThread (siehe Vorlage: ha03/src/main/java/AppendOrHashThread.java).
Betrachten Sie dazu auch die Klassen Hasher (siehe Vorlage: ha03/src/main/java/Hasher.java) und Data (siehe Vorlage: ha03/src/main/java/Data.java), sowie die Klasse Main (siehe Vorlage: ha03/src/main/Main.java).
Implementieren Sie mittels dieser Klasse einen Thread, der eine ID (Typ String) als Attribut hat. Außerdem hat die Klasse ein Attribut nextThread vom Typ AppendOrHashThread. Der Thread soll seine ID an die statische Referenz word (Data.java) ranhängen oder aber word mittels Hasher.hash() hashen. Wurde word gehashed soll ebenfalls die statische Referenz currentIterations inkrementiert werden. Threads des Typs AppendOrHashThread sollen in einer festen Reihenfolge ausgeführt werden: zuerst zwei Threads die ihre ID an word ranhängen (append) gefolgt von einem Thread der word hashed. Nachdem das word gehashed wurde soll eine neue Iteration beginnen.
Ein Wort wird in einer Iteration jeweils um die ID von t1 und t2 erweitert, indem die IDs beider Threads mit dem Wort konkateniert werden. Dabei ist streng zu beachten, dass zuerst die ID von t1 und dann die ID von t2 an das Wort gehangen wird. Bevor eine neue Iteration beginnt, wird das Wort mit den IDs der Threads in einem eigenen Thread t3 gehashed (nutzen Sie dazu Hasher.hash() aus der Vorlage).
Beispiel:
Sei word="", t1="A" und t2="B"
Dann passiert folgendes in Iteration 1:
t1 wird ausgeführt -> word="A"
t2 wird ausgeführt -> word="A" + "B"
t3 wird ausgeführt -> word=Hasher.hash(word)
In Iteration 2 wird dann wie folgt weiter gemacht:
t1 wird ausgeführt -> word=Hasher.hash(word)+"A"
t2 wird ausgeführt -> word=Hasher.hash(word)+"A" + "B" // * word wie in t3 aus 1. Iteration
t3 wird ausgeführt -> word=Hasher.word(Hasher.hash(word)+"A" + "B") // * word wie in t3 aus 1. Iteration
usw ...
Dieser Ablauf soll numOfIterations-mal (siehe Data.java) ausgeführt werden.
Beispiel:
Test Result
Main.test("A", "B"); fa2551a2e3d3924217fa85ab99413e54
Main.test(null, null); c50f3cfb68b1f71cefc732b2bca5e4a0
Klasse Data
Code:
public class Data {
public static int numOfIterations = 5000;
public static int currentIterations = 0;
public static String word = "";
public static boolean verify(String t1, String t2, String hash) {
// TODO: implement me
return false;
}
}
Code:
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Hasher {
public static String hash(String word) {
String result = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
BigInteger n = new BigInteger(1, md.digest(word.getBytes()));
result = String.format("%1$32s", n.toString(16)).replace(" ", "0");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
}
Code:
public class Main {
public static void main(String[] args) {
// Quiz #3 Aufgabe 3
// t1 -> AppendOrHashThread("A") & t2 -> AppendOrHashThread("B") x 5000 Iterationen
// t1 -> AppendOrHashThread(null) & t2 -> AppendOrHashThread(null) x 5000 Iterationen
// Quiz #3 Aufgabe 4
System.out.println(Data.verify("A", "B", "c95ac9f9c7ffe17093466ef2a6bce3aa"));
System.out.println(Data.verify(null, null, "7fcb4080ccece5443aa2a49ed29f4421"));
}
}
Mein Code
Code:
public class AppendOrHashThread {
public String id;
public AppendOrHashThread nextThread;
public AppendOrHashThread() {
}
Thread t1 = new Thread(new MyThread(), "T1");
Thread t2 = new Thread(new MyThread(), "T2");
Thread t3 = new Thread(new MyThread(), "T3");
class MyThread implements Runnable {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println("Thread started: " + t.getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread ended: " + t.getName());
}
}
}