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:
Die Berechnung der Funktion calcPruef scheint zu passen: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}; }
Ergebnis: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]);
Jetzt mein Problem. Wenn ich folgende Ausführe:Code:Result 9,8,7,6 = 3 | 5 | 163 Result 9,8,7,6 = 3 | 5 | 163
Hätte ich erwartet, dass die das Ergebnis von "calcPruefNext" die Prüfsumme 163 ergibt (und a=3 , b=5)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]);
Ich erhalte jedoch
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.Code:Result 9,8,7,6 = 3 | -6 | -189
Kann mir jemand helfen?

Zitieren