aboutsummaryrefslogtreecommitdiff
path: root/internal/adler32
diff options
context:
space:
mode:
authorGravatar Runxi Yu2025-11-19 08:00:00 +0800
committerGravatar Runxi Yu2025-11-19 08:00:00 +0800
commit86bd80e453103d01b05bb2bd8476750192dcd114 (patch)
treeb57972190951321708cd74ad196ee436fe43dae7 /internal/adler32
parentbyteorder: Import (diff)
signatureNo signature
adler32: Unroll update loop
Diffstat (limited to 'internal/adler32')
-rw-r--r--internal/adler32/adler32.go77
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