1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package hash_test
6
7import (
8	"bytes"
9	"crypto/sha256"
10	"encoding"
11	"fmt"
12	"log"
13)
14
15func Example_binaryMarshaler() {
16	const (
17		input1 = "The tunneling gopher digs downwards, "
18		input2 = "unaware of what he will find."
19	)
20
21	first := sha256.New()
22	first.Write([]byte(input1))
23
24	marshaler, ok := first.(encoding.BinaryMarshaler)
25	if !ok {
26		log.Fatal("first does not implement encoding.BinaryMarshaler")
27	}
28	state, err := marshaler.MarshalBinary()
29	if err != nil {
30		log.Fatal("unable to marshal hash:", err)
31	}
32
33	second := sha256.New()
34
35	unmarshaler, ok := second.(encoding.BinaryUnmarshaler)
36	if !ok {
37		log.Fatal("second does not implement encoding.BinaryUnmarshaler")
38	}
39	if err := unmarshaler.UnmarshalBinary(state); err != nil {
40		log.Fatal("unable to unmarshal hash:", err)
41	}
42
43	first.Write([]byte(input2))
44	second.Write([]byte(input2))
45
46	fmt.Printf("%x\n", first.Sum(nil))
47	fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil)))
48	// Output:
49	// 57d51a066f3a39942649cd9a76c77e97ceab246756ff3888659e6aa5a07f4a52
50	// true
51}
52