diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-03-05 23:38:34 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2017-03-09 22:50:14 +0800 |
commit | 3b00a77de57ab2737a7887521c192ce004c721e3 (patch) | |
tree | 74f9abad1af8fec472c2d5cb5f4ab424e44f9b1f /crypto/crypto.go | |
parent | 288700c4d884321b7de7119b596c6e052fa33b27 (diff) | |
download | dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.gz dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.bz2 dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.lz dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.xz dexon-3b00a77de57ab2737a7887521c192ce004c721e3.tar.zst dexon-3b00a77de57ab2737a7887521c192ce004c721e3.zip |
crypto, pow: add pure Go implementation of ethash
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...) } |