sha1
sha2: (一系列哈希算法,更可靠,更安全)
– SHA-224
– SHA-256 ===> 比特币, 以太坊,都使用
– SHA-384
– SHA-512

SHA256算法使用的哈希值长度是256位。

package main

import (
	"crypto/sha256"
	"fmt"
	"io"
	"os"
)

const filename = "D:\\www\\gostudy\\keystudy\\Ethereum-Wallet-macosx-0-9-3.dmg"
//macOS 官方哈希
//Ethereum-Wallet-macosx-0-9-3.dmg
//c90fb7aad36b3a8357cac9472776b0e92363b2b8c684b8ea36d160a68cbe829f

func main()  {
	//1、open文件
	fp,err := os.Open(filename)
	if err != nil{
		panic(err)
	}
	defer fp.Close()

	//2、创建hash器
	hasher := sha256.New()

	//3、copy句柄,利用指针将fp内容拷贝到hasher中
	//func Copy(dst Writer, src Reader) (written int64, err error)
	length,err := io.Copy(hasher,fp)
	if err != nil{
		panic(err)
	}
	fmt.Printf("length:%d\n",length)
	//4、hash sum操作
	hash := hasher.Sum(nil)

	fmt.Printf("hash is : %x \n",hash)
}

输出

length:60969776
hash is : c90fb7aad36b3a8357cac9472776b0e92363b2b8c684b8ea36d160a68cbe829f 

io.Copy() 方法
io.Copy() 方法实现了两个文件指针之间的内容拷贝。该方法的原型如下

func Copy(dst Writer, src Reader) (written int64, err error)
io.Copy() 方法将副本从 src 复制到 dst ,直到 src 达到文件末尾 ( EOF ) 或发生错误,然后返回复制的字节数和复制时遇到的第一个错误( 如果有 )

有了这个函数,我们就省去了先把内容读取到内存,然后将内存中的内容写到文件的过程,于是,我们的代码就可以改成如下方式

示例代码

package main

import (
    "io"
    "net/http"
    "os"
)

func main() {
    imgUrl := "https://www.twle.cn/static/i/img1.jpg"

    // Get the data
    resp, err := http.Get(imgUrl)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    // 创建一个文件用于保存
    out, err := os.Create("img1.jpg")
    if err != nil {
        panic(err)
    }
    defer out.Close()

    // 然后将响应流和文件流对接起来
    _, err = io.Copy(out, resp.Body)
    if err != nil {
        panic(err)
    }
}