aboutsummaryrefslogtreecommitdiff
path: root/internal/adler32
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-04 08:26:56 +0800
committerGravatar Runxi Yu2026-03-04 08:59:53 +0800
commitab7501be34032fb9e5c48726a68ae90a917af9eb (patch)
tree20d005647569befea8133e953c3270e8fd2a2a5b /internal/adler32
parent*: gofumpt (diff)
signatureNo signature
*: Lint
Diffstat (limited to 'internal/adler32')
-rw-r--r--internal/adler32/adler32_amd64.go8
-rw-r--r--internal/adler32/adler32_generic.go5
-rw-r--r--internal/adler32/bench_test.go3
3 files changed, 15 insertions, 1 deletions
diff --git a/internal/adler32/adler32_amd64.go b/internal/adler32/adler32_amd64.go
index cb67f21c..7dfab299 100644
--- a/internal/adler32/adler32_amd64.go
+++ b/internal/adler32/adler32_amd64.go
@@ -27,8 +27,10 @@ func New() hash.Hash32 {
if !hasAVX2 {
return adler32.New()
}
+
d := new(digest)
d.Reset()
+
return d
}
@@ -36,6 +38,7 @@ func (d *digest) MarshalBinary() ([]byte, error) {
b := make([]byte, 0, marshaledSize)
b = append(b, magic...)
b = binary.BigEndian.AppendUint32(b, uint32(*d))
+
return b, nil
}
@@ -43,10 +46,13 @@ func (d *digest) UnmarshalBinary(b []byte) error {
if len(b) < len(magic) || string(b[:len(magic)]) != magic {
return errors.New("hash/adler32: invalid hash state identifier")
}
+
if len(b) != marshaledSize {
return errors.New("hash/adler32: invalid hash state size")
}
+
*d = digest(binary.BigEndian.Uint32(b[len(magic):]))
+
return nil
}
@@ -62,6 +68,7 @@ func (d *digest) Write(data []byte) (nn int, err error) {
h := update(uint32(*d), data)
*d = digest(h)
}
+
return len(data), nil
}
@@ -76,5 +83,6 @@ func Checksum(data []byte) uint32 {
if hasAVX2 && len(data) >= 64 {
return adler32_avx2(1, data)
}
+
return adler32.Checksum(data)
}
diff --git a/internal/adler32/adler32_generic.go b/internal/adler32/adler32_generic.go
index 0908d8f7..56e3ff8b 100644
--- a/internal/adler32/adler32_generic.go
+++ b/internal/adler32/adler32_generic.go
@@ -16,11 +16,13 @@ const (
// Add p to the running checksum d.
func update(d uint32, p []byte) uint32 {
s1, s2 := d&0xffff, 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])
s2 += s1
@@ -32,13 +34,16 @@ func update(d uint32, p []byte) uint32 {
s2 += s1
p = p[4:]
}
+
for _, x := range p {
s1 += uint32(x)
s2 += s1
}
+
s1 %= mod
s2 %= mod
p = q
}
+
return s2<<16 | s1
}
diff --git a/internal/adler32/bench_test.go b/internal/adler32/bench_test.go
index 6c6f75ea..d2aebe8f 100644
--- a/internal/adler32/bench_test.go
+++ b/internal/adler32/bench_test.go
@@ -10,7 +10,7 @@ const benchmarkSize = 64 * 1024
var data = make([]byte, benchmarkSize)
-func init() {
+func init() { //nolint:gochecknoinits
for i := range benchmarkSize {
data[i] = byte(i % 256)
}
@@ -18,6 +18,7 @@ func init() {
func BenchmarkChecksum(b *testing.B) {
b.ReportAllocs()
+
for b.Loop() {
adler32.Checksum(data)
}