code: func (h *Hasher) Sum(b []byte) (s []byte) {
  	t := h.getTree()
  	// write the last section with final flag set to true
  	go h.writeSection(t.cursor, t.section, true, true)
  	// wait for the result
  	s = <-t.result
  	span := t.span
  	// release the tree resource back to the pool
  	h.releaseTree()
  	// b + sha3(span + BMT(pure_chunk))
  	if len(span) == 0 {
  		return append(b, s...)
  	}
  	return doSum(h.pool.hasher(), b, span, s)
  }
docs: // Sum returns the BMT root hash of the buffer
  // using Sum presupposes sequential synchronous writes (io.Writer interface)
  // hash.Hash interface Sum method appends the byte slice to the underlying
  // data before it calculates and returns the hash of the chunk
  // caller must make sure Sum is not called concurrently with Write, writeSection