// Copyright 2020 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package snap import ( "crypto/rand" "fmt" "testing" "github.com/ethereum/go-ethereum/crypto" "golang.org/x/crypto/sha3" ) func TestHashing(t *testing.T) { var bytecodes = make([][]byte, 10) for i := 0; i < len(bytecodes); i++ { buf := make([]byte, 100) rand.Read(buf) bytecodes[i] = buf } var want, got string var old = func() { hasher := sha3.NewLegacyKeccak256() for i := 0; i < len(bytecodes); i++ { hasher.Reset() hasher.Write(bytecodes[i]) hash := hasher.Sum(nil) got = fmt.Sprintf("%v\n%v", got, hash) } } var new = func() { hasher := sha3.NewLegacyKeccak256().(crypto.KeccakState) var hash = make([]byte, 32) for i := 0; i < len(bytecodes); i++ { hasher.Reset() hasher.Write(bytecodes[i]) hasher.Read(hash) want = fmt.Sprintf("%v\n%v", want, hash) } } old() new() if want != got { t.Errorf("want\n%v\ngot\n%v\n", want, got) } } func BenchmarkHashing(b *testing.B) { var bytecodes = make([][]byte, 10000) for i := 0; i < len(bytecodes); i++ { buf := make([]byte, 100) rand.Read(buf) bytecodes[i] = buf } var old = func() { hasher := sha3.NewLegacyKeccak256() for i := 0; i < len(bytecodes); i++ { hasher.Reset() hasher.Write(bytecodes[i]) hasher.Sum(nil) } } var new = func() { hasher := sha3.NewLegacyKeccak256().(crypto.KeccakState) var hash = make([]byte, 32) for i := 0; i < len(bytecodes); i++ { hasher.Reset() hasher.Write(bytecodes[i]) hasher.Read(hash) } } b.Run("old", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { old() } }) b.Run("new", func(b *testing.B) { b.ReportAllocs() for i := 0; i < b.N; i++ { new() } }) }