diff options
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r-- | crypto/crypto.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go index ecc3be3ce..a60a4617e 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -37,6 +37,11 @@ var ( secp256k1_halfN = new(big.Int).Div(secp256k1_N, big.NewInt(2)) ) +// Hasher is a repetitive hasher allowing the same hash data structures to be +// reused between hash runs instead of requiring new ones to be created. +type Hasher func(data []byte) []byte + +// Keccak256 calculates and returns the Keccak256 hash of the input data. func Keccak256(data ...[]byte) []byte { d := sha3.NewKeccak256() for _, b := range data { @@ -45,6 +50,8 @@ func Keccak256(data ...[]byte) []byte { return d.Sum(nil) } +// Keccak256Hash calculates and returns the Keccak256 hash of the input data, +// converting it to an internal Hash data structure. func Keccak256Hash(data ...[]byte) (h common.Hash) { d := sha3.NewKeccak256() for _, b := range data { @@ -54,6 +61,47 @@ func Keccak256Hash(data ...[]byte) (h common.Hash) { return h } +// Keccak256Hasher creates a repetitive Keccak256 hasher, allowing the same hash +// data structures to be reused between hash runs instead of requiring new ones +// to be created. +// +// The returned function is not thread safe! +func Keccak256Hasher() Hasher { + hasher := sha3.NewKeccak256() + + return func(data []byte) []byte { + hasher.Write(data) + result := hasher.Sum(nil) + hasher.Reset() + return result + } +} + +// Keccak512 calculates and returns the Keccak512 hash of the input data. +func Keccak512(data ...[]byte) []byte { + d := sha3.NewKeccak512() + for _, b := range data { + d.Write(b) + } + return d.Sum(nil) +} + +// Keccak512Hasher creates a repetitive Keccak512 hasher, allowing the same hash +// data structures to be reused between hash runs instead of requiring new ones +// to be created. +// +// The returned function is not thread safe! +func Keccak512Hasher() Hasher { + hasher := sha3.NewKeccak512() + + return func(data []byte) []byte { + hasher.Write(data) + result := hasher.Sum(nil) + hasher.Reset() + return result + } +} + // Deprecated: For backward compatibility as other packages depend on these func Sha3Hash(data ...[]byte) common.Hash { return Keccak256Hash(data...) } |