- package merkle
-
- import (
- "github.com/tendermint/tendermint/crypto/tmhash"
- )
-
- // simpleHashFromTwoHashes is the basic operation of the Merkle tree: Hash(left | right).
- func simpleHashFromTwoHashes(left, right []byte) []byte {
- var hasher = tmhash.New()
- err := encodeByteSlice(hasher, left)
- if err != nil {
- panic(err)
- }
- err = encodeByteSlice(hasher, right)
- if err != nil {
- panic(err)
- }
- return hasher.Sum(nil)
- }
-
- // SimpleHashFromByteSlices computes a Merkle tree where the leaves are the byte slice,
- // in the provided order.
- func SimpleHashFromByteSlices(items [][]byte) []byte {
- switch len(items) {
- case 0:
- return nil
- case 1:
- return tmhash.Sum(items[0])
- default:
- left := SimpleHashFromByteSlices(items[:(len(items)+1)/2])
- right := SimpleHashFromByteSlices(items[(len(items)+1)/2:])
- return simpleHashFromTwoHashes(left, right)
- }
- }
-
- // SimpleHashFromMap computes a Merkle tree from sorted map.
- // Like calling SimpleHashFromHashers with
- // `item = []byte(Hash(key) | Hash(value))`,
- // sorted by `item`.
- func SimpleHashFromMap(m map[string][]byte) []byte {
- sm := newSimpleMap()
- for k, v := range m {
- sm.Set(k, v)
- }
- return sm.Hash()
- }
|