- package merkle
-
- import (
- "math/bits"
- )
-
- // 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 leafHash(items[0])
- default:
- k := getSplitPoint(len(items))
- left := SimpleHashFromByteSlices(items[:k])
- right := SimpleHashFromByteSlices(items[k:])
- return innerHash(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()
- }
-
- // getSplitPoint returns the largest power of 2 less than length
- func getSplitPoint(length int) int {
- if length < 1 {
- panic("Trying to split a tree with size < 1")
- }
- uLength := uint(length)
- bitlen := bits.Len(uLength)
- k := 1 << uint(bitlen-1)
- if k == length {
- k >>= 1
- }
- return k
- }
|