diff options
| author | 2025-11-19 08:00:00 +0800 | |
|---|---|---|
| committer | 2025-11-19 08:00:00 +0800 | |
| commit | 86bd80e453103d01b05bb2bd8476750192dcd114 (patch) | |
| tree | b57972190951321708cd74ad196ee436fe43dae7 /internal | |
| parent | byteorder: Import (diff) | |
| signature | No signature | |
adler32: Unroll update loop
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/adler32/adler32.go | 77 |
1 files changed, 70 insertions, 7 deletions
diff --git a/internal/adler32/adler32.go b/internal/adler32/adler32.go index c6179789..f8a289f5 100644 --- a/internal/adler32/adler32.go +++ b/internal/adler32/adler32.go @@ -16,7 +16,8 @@ package adler32 import ( "errors" "hash" - "internal/byteorder" + + "git.sr.ht/~runxiyu/furgit/internal/byteorder" ) const ( @@ -86,26 +87,88 @@ func (d *digest) Clone() (hash.Cloner, error) { // Add p to the running checksum d. func update(d digest, p []byte) digest { s1, s2 := uint32(d&0xffff), uint32(d>>16) + for len(p) > 0 { var q []byte if len(p) > nmax { p, q = p[:nmax], p[nmax:] } - for len(p) >= 4 { - s1 += uint32(p[0]) + + for len(p) >= 32 { + v := p[:32] + p = p[32:] + + s1 += uint32(v[0]) + s2 += s1 + s1 += uint32(v[1]) + s2 += s1 + s1 += uint32(v[2]) + s2 += s1 + s1 += uint32(v[3]) + s2 += s1 + s1 += uint32(v[4]) + s2 += s1 + s1 += uint32(v[5]) + s2 += s1 + s1 += uint32(v[6]) + s2 += s1 + s1 += uint32(v[7]) + s2 += s1 + s1 += uint32(v[8]) + s2 += s1 + s1 += uint32(v[9]) + s2 += s1 + s1 += uint32(v[10]) + s2 += s1 + s1 += uint32(v[11]) + s2 += s1 + s1 += uint32(v[12]) + s2 += s1 + s1 += uint32(v[13]) s2 += s1 - s1 += uint32(p[1]) + s1 += uint32(v[14]) s2 += s1 - s1 += uint32(p[2]) + s1 += uint32(v[15]) s2 += s1 - s1 += uint32(p[3]) + s1 += uint32(v[16]) + s2 += s1 + s1 += uint32(v[17]) + s2 += s1 + s1 += uint32(v[18]) + s2 += s1 + s1 += uint32(v[19]) + s2 += s1 + s1 += uint32(v[20]) + s2 += s1 + s1 += uint32(v[21]) + s2 += s1 + s1 += uint32(v[22]) + s2 += s1 + s1 += uint32(v[23]) + s2 += s1 + s1 += uint32(v[24]) + s2 += s1 + s1 += uint32(v[25]) + s2 += s1 + s1 += uint32(v[26]) + s2 += s1 + s1 += uint32(v[27]) + s2 += s1 + s1 += uint32(v[28]) + s2 += s1 + s1 += uint32(v[29]) + s2 += s1 + s1 += uint32(v[30]) + s2 += s1 + s1 += uint32(v[31]) s2 += s1 - p = p[4:] } + for _, x := range p { s1 += uint32(x) s2 += s1 } + s1 %= mod s2 %= mod p = q |
