From c43d3c8e85abeca4200e3f8423600fd6827527cc Mon Sep 17 00:00:00 2001 From: yperbasis Date: Fri, 14 Aug 2026 17:16:43 +0200 Subject: [PATCH 1/2] keccak: optimize one-byte streaming writes --- keccak_asm.go | 9 +++++++++ keccak_write_bench_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 keccak_write_bench_test.go diff --git a/keccak_asm.go b/keccak_asm.go index 37ce284..fc22b4f 100644 --- a/keccak_asm.go +++ b/keccak_asm.go @@ -36,6 +36,15 @@ func (s *sponge) Write(p []byte) (int, error) { panic("keccak: Write after Read") } n := len(p) + if n == 1 { + s.buf[s.absorbed] = p[0] + s.absorbed++ + if s.absorbed == rate { + xorAndPermute(&s.state, &s.buf[0]) + s.absorbed = 0 + } + return 1, nil + } if s.absorbed > 0 { x := copy(s.buf[s.absorbed:rate], p) s.absorbed += x diff --git a/keccak_write_bench_test.go b/keccak_write_bench_test.go new file mode 100644 index 0000000..af94350 --- /dev/null +++ b/keccak_write_bench_test.go @@ -0,0 +1,25 @@ +package keccak + +import ( + "strconv" + "testing" +) + +var oneByteWriteDigest [32]byte + +func BenchmarkHasherOneByteWrites(b *testing.B) { + for _, size := range []int{32, 128, 256} { + b.Run(strconv.Itoa(size), func(b *testing.B) { + data := make([]byte, size) + b.SetBytes(int64(size)) + b.ReportAllocs() + for b.Loop() { + var h Hasher + for i := range data { + h.Write(data[i : i+1]) + } + oneByteWriteDigest = h.Sum256() + } + }) + } +} From 4db4d0cc46c8e5f83feb1ca2524895b152cb6a5f Mon Sep 17 00:00:00 2001 From: Alexey Sharov Date: Wed, 2 Sep 2026 11:43:21 +0700 Subject: [PATCH 2/2] keccak: drop the benchmark sink b.Loop already keeps loop-body results alive on go1.24. --- keccak_write_bench_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keccak_write_bench_test.go b/keccak_write_bench_test.go index af94350..7304e31 100644 --- a/keccak_write_bench_test.go +++ b/keccak_write_bench_test.go @@ -5,8 +5,6 @@ import ( "testing" ) -var oneByteWriteDigest [32]byte - func BenchmarkHasherOneByteWrites(b *testing.B) { for _, size := range []int{32, 128, 256} { b.Run(strconv.Itoa(size), func(b *testing.B) { @@ -18,7 +16,7 @@ func BenchmarkHasherOneByteWrites(b *testing.B) { for i := range data { h.Write(data[i : i+1]) } - oneByteWriteDigest = h.Sum256() + h.Sum256() } }) }