Ergebnis 1 bis 2 von 2

Hybrid-Darstellung

  1. #1
    Capt'n Crunch
    Registriert seit
    10.07.2008
    Beiträge
    999

    Frage [Java] RSync Rolling Checksum

    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?
    bitcoin. Banking Is Necessary. Banks Are Not. - by Lincoln6Echo

    Das ganze Mysql usw is mir zu viel arbeit um es zu lernen

  2. #2
    Capt'n Crunch
    Registriert seit
    10.07.2008
    Beiträge
    999

    Standard AW: [Java] RSync Rolling Checksum

    Fehler war hier:
    Code:
    for(int i = k; i <= l; i++) { result_b += (l-i+1)*x[i-1]; }
    Das "+" hat gefehlt.
    bitcoin. Banking Is Necessary. Banks Are Not. - by Lincoln6Echo

    Das ganze Mysql usw is mir zu viel arbeit um es zu lernen

  3. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Barny (30.09.2019)

Ähnliche Themen

  1. [Text-Tut] Kali Rolling mit Cuda 8 + Pyrit
    Von jabberwocky im Forum Biete Tutorials
    Antworten: 1
    Letzter Beitrag: 27.06.2017, 19:04
  2. Java zu *.exe
    Von haggys22 im Forum Java
    Antworten: 3
    Letzter Beitrag: 14.12.2010, 23:12
  3. Java als .exe
    Von MC_Amann im Forum Java
    Antworten: 7
    Letzter Beitrag: 15.05.2010, 16:16
  4. MD5 Checksum oder CRC Fehler
    Von Sirius.GER im Forum Windows
    Antworten: 4
    Letzter Beitrag: 18.03.2010, 22:08

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •