crypto / sha1不匹配openssl命令

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