prysm-pulse/beacon-chain/state/stateutil/hash_function.go
Nishant Das 63df1d0b8d
Add Merkleize With Customized Hasher (#5234)
* add buffer for merkleizer
* add comment
* Merge refs/heads/master into merkleize
* Merge refs/heads/master into merkleize
* Merge refs/heads/master into merkleize
* Merge refs/heads/master into merkleize
* Merge refs/heads/master into merkleize
* Merge branch 'master' of https://github.com/prysmaticlabs/geth-sharding into merkleize
* Merge branch 'merkleize' of https://github.com/prysmaticlabs/geth-sharding into merkleize
* lint
* Merge refs/heads/master into merkleize
2020-03-29 06:13:24 +00:00

47 lines
1.0 KiB
Go

package stateutil
import "encoding/binary"
type HashFn func(input []byte) [32]byte
// Hasher describes an interface through which we can
// perform hash operations on byte arrays,indices,etc.
type Hasher interface {
Hash(a []byte) [32]byte
Combi(a [32]byte, b [32]byte) [32]byte
MixIn(a [32]byte, i uint64) [32]byte
}
type HasherFunc struct {
b [64]byte
hashFunc HashFn
}
// NewHasherFunc is the constructor for the object
// that fulfills the Hasher interface.
func NewHasherFunc(h HashFn) *HasherFunc {
return &HasherFunc{
b: [64]byte{},
hashFunc: h,
}
}
// Hash utilizes the provided hash function for
// the object.
func (h *HasherFunc) Hash(a []byte) [32]byte {
return h.hashFunc(a)
}
func (h *HasherFunc) Combi(a [32]byte, b [32]byte) [32]byte {
copy(h.b[:32], a[:])
copy(h.b[32:], b[:])
return h.Hash(h.b[:])
}
func (h *HasherFunc) MixIn(a [32]byte, i uint64) [32]byte {
copy(h.b[:32], a[:])
copy(h.b[32:], make([]byte, 32, 32))
binary.LittleEndian.PutUint64(h.b[32:], i)
return h.Hash(h.b[:])
}