mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 04:08:27 +08:00
adler32 optimization #818
This commit is contained in:
parent
5893634906
commit
2d9ef055d5
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user