/
ghash.go
67 lines (61 loc) · 1.33 KB
/
ghash.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// A tool to compute various crypto hashes on files
// Demonstrates: crypto hashes and buffered I/O
package main
import (
"bufio"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"errors"
"fmt"
"hash"
"os"
)
func Hash(hashname string, filename string) (sum string, err error) {
f, err := os.Open(filename)
if err!=nil {
return
}
var h hash.Hash
switch hashname {
case "md5":
h = md5.New()
case "sha1":
h = sha1.New()
case "sha2", "sha256":
h = sha256.New()
case "sha5", "sha512":
h = sha512.New()
default:
err = errors.New("unknown hash: "+hashname)
return
}
var nr int
buf := make([]byte, h.BlockSize())
bf := bufio.NewReader(f)
for {
nr, _ = bf.Read(buf)
h.Write(buf[0:nr])
if nr<len(buf) {
break
}
}
f.Close()
sum = fmt.Sprintf("%0x", h.Sum(nil))
return
}
func main() {
if len(os.Args)<3 {
fmt.Println("use: md5|sha1|sha2|sha5 filenames...")
return
}
for i:=2 ; i<len(os.Args) ; i++ {
digest, err := Hash(os.Args[1], os.Args[i])
if err!=nil {
fmt.Println(err)
} else {
fmt.Printf("%s %s\n", digest, os.Args[i])
}
}
}