]> Sergey Matveev's repositories - btrtrc.git/blob - metainfo/hash.go
gofmt simplify
[btrtrc.git] / metainfo / hash.go
1 package metainfo
2
3 import (
4         "crypto/sha1"
5         "encoding/hex"
6         "fmt"
7 )
8
9 const HashSize = 20
10
11 // 20-byte SHA1 hash used for info and pieces.
12 type Hash [HashSize]byte
13
14 func (h Hash) Bytes() []byte {
15         return h[:]
16 }
17
18 func (h Hash) AsString() string {
19         return string(h[:])
20 }
21
22 func (h Hash) String() string {
23         return h.HexString()
24 }
25
26 func (h Hash) HexString() string {
27         return fmt.Sprintf("%x", h[:])
28 }
29
30 func (h *Hash) FromHexString(s string) (err error) {
31         if len(s) != 2*HashSize {
32                 err = fmt.Errorf("hash hex string has bad length: %d", len(s))
33                 return
34         }
35         n, err := hex.Decode(h[:], []byte(s))
36         if err != nil {
37                 return
38         }
39         if n != HashSize {
40                 panic(n)
41         }
42         return
43 }
44
45 func NewHashFromHex(s string) (h Hash) {
46         err := h.FromHexString(s)
47         if err != nil {
48                 panic(err)
49         }
50         return
51 }
52
53 func HashBytes(b []byte) (ret Hash) {
54         hasher := sha1.New()
55         hasher.Write(b)
56         copy(ret[:], hasher.Sum(nil))
57         return
58 }