Hallo zusammen,
ich versuche die fortlaufende Prüfsumme in rsync nachzubauen.
https://rsync.samba.org/tech_report/node3.html
Es geht mir nicht um Geschwindigkeit, sondern um Verständnis.
Mein Code:
Code:
public static int[] calcPruef(int k,int l, int x[], int M) {
int result_a = 0, result_b = 0, result_s = 0;
for(int i = k; i <= l; i++) { result_a += x[i-1]; }
result_a = result_a % M;
for(int i = k; i <= l; i++) { result_b = (l-i+1)*x[i-1]; }
result_b = result_b % M;
result_s = result_a + M*result_b;
return new int[] {result_a,result_b,result_s};
}
public static int[] calcPruefNext(int k,int l, int x[], int M,int result_a, int result_b) {
int result_a_new = 0, result_b_new = 0, result_s = 0;
result_a_new = (result_a-x[k-1]+x[l-1+1]) % M;
result_b_new = (result_b - (l-k+1)*x[k-1] + result_a_new) % M;
result_s = result_a_new + M*result_b_new;
return new int[] {result_a_new,result_b_new,result_s};
}
Die Berechnung der Funktion calcPruef scheint zu passen:
Code:
x = new int[] {9,8,7,6,5};
k = 1;
l = 5;
result = calcPruef(k,l,x,M);
System.out.println("Result " + Arrays.stream(Arrays.copyOfRange(x,k-1,l-1)).mapToObj(String::valueOf).collect(Collectors.joining(",")) + " = " + result[0] + " | " + result[1] + " | " + result[2]);
x = new int[]{4,2,5,9,8,7,6,5};
k = 4;
l = 8;
result = calcPruef(k,l,x,M);
System.out.println("Result " + Arrays.stream(Arrays.copyOfRange(x,k-1,l-1)).mapToObj(String::valueOf).collect(Collectors.joining(",")) + " = " + result[0] + " | " + result[1] + " | " + result[2]);
Ergebnis:
Code:
Result 9,8,7,6 = 3 | 5 | 163
Result 9,8,7,6 = 3 | 5 | 163
Jetzt mein Problem. Wenn ich folgende Ausführe:
Code:
x = new int[] {9,8,7,6,5};
k = 1;
l = 5;
result = calcPruef(k,l,x,M);
System.out.println("Result " + Arrays.stream(Arrays.copyOfRange(x,k-1,l-1)).mapToObj(String::valueOf).collect(Collectors.joining(",")) + " = " + result[0] + " | " + result[1] + " | " + result[2]);
x = new int[]{3,9,8,7,6,5};
k = 1;
l = 5;
result = calcPruef(k,l,x,M);
System.out.println("Result " + Arrays.stream(Arrays.copyOfRange(x,k-1,l-1)).mapToObj(String::valueOf).collect(Collectors.joining(",")) + " = " + result[0] + " | " + result[1] + " | " + result[2]);
//Über Fortlaufende Prüfsumme
result = calcPruefNext(k,l,x,M,result[0],result[1]);
l += 1;
k += 1;
System.out.println("Result " + Arrays.stream(Arrays.copyOfRange(x,k-1,l-1)).mapToObj(String::valueOf).collect(Collectors.joining(",")) + " = " + result[0] + " | " + result[1] + " | " + result[2]);
Hätte ich erwartet, dass die das Ergebnis von "calcPruefNext" die Prüfsumme 163 ergibt (und a=3 , b=5)
Ich erhalte jedoch
Code:
Result 9,8,7,6 = 3 | -6 | -189
Leider finde ich den Fehler nicht. Die Berechnung von "result_a_new" scheint zu passen (ergibt 3). Aber das "result_b_new" ist -6, erwartet hätte ich aber eine 5.
Kann mir jemand helfen?