From 2d9ef055d57d289712e2fcc40520410fbf2d37d2 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 8 Jul 2017 11:07:10 +0000 Subject: [PATCH] adler32 optimization #818 --- src/zabapgit_util.prog.abap | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap index a1e56414e..06e39421c 100644 --- a/src/zabapgit_util.prog.abap +++ b/src/zabapgit_util.prog.abap @@ -302,7 +302,8 @@ CLASS lcl_hash IMPLEMENTATION. METHOD adler32. - CONSTANTS: lc_adler TYPE i VALUE 65521. + CONSTANTS: lc_adler TYPE i VALUE 65521, + lc_max_b TYPE i VALUE 1800000000. DATA: lv_index TYPE i, lv_a TYPE i VALUE 1, @@ -316,10 +317,22 @@ CLASS lcl_hash IMPLEMENTATION. DO xstrlen( iv_xstring ) TIMES. lv_index = sy-index - 1. - lv_a = ( lv_a + iv_xstring+lv_index(1) ) MOD lc_adler. - lv_b = ( lv_b + lv_a ) MOD lc_adler. + lv_a = lv_a + iv_xstring+lv_index(1). + lv_b = lv_b + lv_a. + +* delay the MOD operation until the integer might overflow +* articles describe 5552 additions are allowed, but this assumes unsigned integers +* instead of allowing a fixed number of additions before running MOD, then +* just compare value of lv_b, this is 1 operation less than comparing and adding + IF lv_b > lc_max_b. + lv_a = lv_a MOD lc_adler. + lv_b = lv_b MOD lc_adler. + ENDIF. ENDDO. + lv_a = lv_a MOD lc_adler. + lv_b = lv_b MOD lc_adler. + lv_x = lv_a. lv_ca = lv_x.