I'm trying to compute sha1, but the sha1 is not matching with the openssl command.
I compute the hash for an empty file like so on my Macbook :
$ touch test.txt
$ openssl sha1 -hex test.txt
SHA1(test.txt)= da39a3ee5e6b4b0d3255bfef95601890afd80709
And here is the simple test code I have :
package main
import "fmt"
import "crypto/sha1"
func main() {
hash := sha1.New()
hash.Write([]byte{0x00})
fmt.Printf("Hash got %x, expected da39a3ee5e6b4b0d3255bfef95601890afd80709", hash.Sum(nil))
}
Here is the output as you see the output does not match, anyone know what I'm doing wrong?
Hash got 5ba93c9db0cff93f52b521d7420e43f6eda2784f, expected da39a3ee5e6b4b0d3255bfef95601890afd80709
Your Go code is computing the SHA of an input of length 1, with a value of [ 0 ]
.
The touch
command actually creates an empty file (zero length), so the equivalent Go code would be:
hash := sha1.New()
// hash.Write([]byte{})
data := hash.Sum(nil)
fmt.Printf("hash: %x", data)
The (commented) Write call above is a no-op. Playground
Your test code does not actually seem to read from a file. Anyway, per your request, here is what a full sha utility would look like in Go:
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Printf("usage: %s <file>
", os.Args[0])
os.Exit(1)
}
file := os.Args[1]
f, err := os.Open(file)
if err != nil {
log.Fatal(err)
}
defer f.Close()
hash := sha1.New()
_, err = io.Copy(hash, f)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%x
", hash.Sum(nil))
}
Testing it out, I get:
$ touch test.txt
$ go run sha.go test.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709