5550 : len; len -= tlen; do { a += *data++; b += a; } while (--tlen); a = (a & 0xffff) + (a >> 16) * (65536-MOD_ADLER); b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER);
/* It can be shown that a <= 0x1013a here, so a single subtract will do. */ if (a >= MOD_ADLER) a -= MOD_ADLER; /* It can be shown that b can reach 0xffef1 here. */ b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER); if (b >= MOD_ADLER) b -= MOD_ADLER; return (b << 16) | a;
Sztuczki wykorzystane dla zwiększenia wydajności: Dzięki wykorzystaniu większych (32-bitowych) tymczasowych sum można sumować większe ilości danych, zanim zajdzie konieczność wykonania sumy modulo 65521. Jest wymagane, aby została wykonana suma modulo 65521, zanim suma ulegnie przepełnieniu, co spowodowałoby wykonanie nieprawidłowej sumy modulo 232 = 4294967296. 65536 ≡ 15 mod 65521, więc 65536x ≡ 15x (mod 65521) oraz wyrażenie (x & 0xffff) + (x >> 16)*15 sprowadza się do x modulo 65521. Wykonanie tego tylko raz nie gwarantuje poprawnego wyniku, ale wiadomo, że będzie on zawsze mniejszy niż 0xffff0. Drugie powtórzenie gwarantuje wynik mniejszy niż 65745, po czym pojedyncze odejmowanie warunkowe redukuje sumę do przedziału 0..65520. Liczba 5550 jest największą liczbą sum, które mogą zostać wykonane bez przepełniania b.