我正在尝试计算sha1,但是sha1与openssl命令不匹配.
我在我的Macbook上计算一个空文件的哈希:
$ touch test.txt
$ openssl sha1 -hex test.txt
SHA1(test.txt)= da39a3ee5e6b4b0d3255bfef95601890afd80709
Run Code Online (Sandbox Code Playgroud)
而这里是一个简单的测试代码,我有:
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))
}
Run Code Online (Sandbox Code Playgroud)
这是输出,因为你看到输出不匹配,任何人都知道我做错了什么?
Hash got 5ba93c9db0cff93f52b521d7420e43f6eda2784f, expected da39a3ee5e6b4b0d3255bfef95601890afd80709
Run Code Online (Sandbox Code Playgroud)
您的Go代码计算长度为1的输入的SHA,其值为[ 0 ]
.
该touch
命令实际上创建了一个空文件(零长度),因此等效的Go代码将是:
hash := sha1.New()
// hash.Write([]byte{})
data := hash.Sum(nil)
fmt.Printf("hash: %x", data)
Run Code Online (Sandbox Code Playgroud)
上面的(注释)Write调用是一个no-op. 操场
您的测试代码实际上似乎没有从文件中读取.无论如何,根据您的要求,这是一个完整的sha实用程序在Go中的样子:
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Printf("usage: %s <file>\n", 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\n", hash.Sum(nil))
}
Run Code Online (Sandbox Code Playgroud)
测试一下,我得到:
$ touch test.txt
$ go run sha.go test.txt
da39a3ee5e6b4b0d3255bfef95601890afd80709
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
416 次 |
最近记录: |