func (dt *DescriptorTree) UID() string {
	return dt.hashPrefix + hex.EncodeToString(dt.hashRecursive)
}
UID returns a unique, deterministic, versioned identifier for this particular
`DescriptorTree`.

This identifier is computed from `dt`'s protobuf schema as well as its
dependencies' schemas.
This means that modifying any schema in the dependency tree, not just `dt`'s,
will result in a new identifier being generated.

The returned string is the hexadecimal representation of `dt`'s internal
recursive hash (computed via the user-specified hasher), prefixed by
`dt.hashPrefix` (also specified by the end-user).
package protoscan
import (
	"encoding/hex"
	"reflect"
	"github.com/gogo/protobuf/proto"
	"github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
	"github.com/pkg/errors"
	"github.com/znly/protein/failure"
)
type descriptorNode struct {
	descr proto.Message
	fqName string
	hashSingle []byte
	hashRecursive []byte
}
func (dn *descriptorNode) Descr() proto.Message { return dn.descr }
type DescriptorTree struct {
	*descriptorNode
	deps []*DescriptorTree
	hashPrefix string
}
func (dt *DescriptorTree) FQName() string { return dt.fqName }