diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /internal/adler32 | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'internal/adler32')
| -rw-r--r-- | internal/adler32/adler32_amd64.go | 8 | ||||
| -rw-r--r-- | internal/adler32/adler32_generic.go | 5 | ||||
| -rw-r--r-- | internal/adler32/bench_test.go | 3 |
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) } |
