11 "golang.org/x/crypto/sha3"
14 // EmptyStringHash represents a 256-bit hash.
15 var EmptyStringHash = NewHash(sha3.Sum256(nil))
17 // NewHash convert the input byte array to hash
18 func NewHash(b32 [32]byte) (h Hash) {
19 h.V0 = binary.BigEndian.Uint64(b32[0:8])
20 h.V1 = binary.BigEndian.Uint64(b32[8:16])
21 h.V2 = binary.BigEndian.Uint64(b32[16:24])
22 h.V3 = binary.BigEndian.Uint64(b32[24:32])
26 // Byte32 return the byte array representation
27 func (h Hash) Byte32() (b32 [32]byte) {
28 binary.BigEndian.PutUint64(b32[0:8], h.V0)
29 binary.BigEndian.PutUint64(b32[8:16], h.V1)
30 binary.BigEndian.PutUint64(b32[16:24], h.V2)
31 binary.BigEndian.PutUint64(b32[24:32], h.V3)
35 // MarshalText satisfies the TextMarshaler interface.
36 // It returns the bytes of h encoded in hex,
37 // for formats that can't hold arbitrary binary data.
38 // It never returns an error.
39 func (h Hash) MarshalText() ([]byte, error) {
46 // UnmarshalText satisfies the TextUnmarshaler interface.
47 // It decodes hex data from b into h.
48 func (h *Hash) UnmarshalText(v []byte) error {
51 return fmt.Errorf("bad length hash string %d", len(v))
54 _, err := hex.Decode(b[:], v)
59 // UnmarshalJSON satisfies the json.Unmarshaler interface.
60 // If b is a JSON-encoded null, it copies the zero-value into h. Othwerwise, it
61 // decodes hex data from b into h.
62 func (h *Hash) UnmarshalJSON(b []byte) error {
63 if bytes.Equal(b, []byte("null")) {
69 if err := json.Unmarshal(b, &s); err != nil {
72 return h.UnmarshalText([]byte(s))
75 // Bytes returns the byte representation
76 func (h Hash) Bytes() []byte {
81 // WriteTo satisfies the io.WriterTo interface.
82 func (h Hash) WriteTo(w io.Writer) (int64, error) {
83 n, err := w.Write(h.Bytes())
87 // ReadFrom satisfies the io.ReaderFrom interface.
88 func (h *Hash) ReadFrom(r io.Reader) (int64, error) {
90 n, err := io.ReadFull(r, b32[:])
99 // IsZero tells whether a Hash pointer is nil or points to an all-zero
101 func (h *Hash) IsZero() bool {
102 return h == nil || *h == Hash{}