aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/crypto.go
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r--crypto/crypto.go48
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...) }