code: func (rh *RefHasher) hash(data []byte, length int) []byte {
  	var section []byte
  	if length == rh.sectionLength {
  		// section contains two data segments (d)
  		section = data
  	} else {
  		// section contains hashes of left and right BMT subtreea
  		// to be calculated by calling hash recursively on left and right half of d
  		length /= 2
  		section = append(rh.hash(data[:length], length), rh.hash(data[length:], length)...)
  	}
  	rh.hasher.Reset()
  	rh.hasher.Write(section)
  	return rh.hasher.Sum(nil)
  }
docs: // data has length maxDataLength = segmentSize * 2^k
  // hash calls itself recursively on both halves of the given slice
  // concatenates the results, and returns the hash of that
  // if the length of d is 2 * segmentSize then just returns the hash of that section