erigon-pulse/common/hasher.go

52 lines
1.0 KiB
Go

package common
import (
"hash"
"sync"
libcommon "github.com/ledgerwatch/erigon-lib/common"
"golang.org/x/crypto/sha3"
)
// keccakState wraps sha3.state. In addition to the usual hash methods, it also supports
// Read to get a variable amount of data from the hash state. Read is faster than Sum
// because it doesn't copy the internal state, but also modifies the internal state.
type keccakState interface {
hash.Hash
Read([]byte) (int, error)
}
type Hasher struct {
Sha keccakState
}
var hashersPool = sync.Pool{
New: func() any {
return &Hasher{Sha: sha3.NewLegacyKeccak256().(keccakState)}
},
}
func NewHasher() *Hasher {
h := hashersPool.Get().(*Hasher)
h.Sha.Reset()
return h
}
func ReturnHasherToPool(h *Hasher) { hashersPool.Put(h) }
func HashData(data []byte) (libcommon.Hash, error) {
h := NewHasher()
defer ReturnHasherToPool(h)
_, err := h.Sha.Write(data)
if err != nil {
return libcommon.Hash{}, err
}
var buf libcommon.Hash
_, err = h.Sha.Read(buf[:])
if err != nil {
return libcommon.Hash{}, err
}
return buf, nil
}