Go计算MD5和SHA1

Go的crypto包中提供了丰富的加密工具,可以计算 MD5、SHA1、SHA256 等等,他们分别在包 crypto/md5、crypto/sha1、crypto/sha256 中。每一种算法提供的接口都大致相同,如下所示(仅列出重要部分):

// 创建一个Hash对象,用于计算相应的加密值
func New() hash.Hash

// 计算 data 的加密值,Size是一个常量,用于表示加密值的长度,MD5为16,SHA1为20
func Sum(data []byte) [Size]byte

// 在hash包中,提供了如下的Hash结构体:
type Hash interface {
    // 通过内嵌 io.Writer 字段提供 io.Writer 接口
    io.Writer

    // 将b表示的字节切片加入当前的hash中,返回计算结果
    Sum(b []byte) []byte
    // ...
}

// 下面的例子中还用到了hex中的一个转换函数:
// 将src表示的16进制切片转换成字符串
func EncodeToString(src []byte) string

一个完整的例子:

package main

import (
    "crypto/md5"
    "crypto/sha1"
    "encoding/hex"
    "fmt"
    "io"
    "log"
    "os"
)

func md5s(s string) string {
    r := md5.Sum([]byte(s))
    return hex.EncodeToString(r[:])
}

func md5f(fName string) string {
    f, e := os.Open(fName)
    if e != nil {
        log.Fatal(e)
    }
    h := md5.New()
    _, e = io.Copy(h, f)
    if e != nil {
        log.Fatal(e)
    }
    return hex.EncodeToString(h.Sum(nil))
}

func sha1s(s string) string {
    r := sha1.Sum([]byte(s))
    return hex.EncodeToString(r[:])
}

func sha1f(fName string) string {
    f, e := os.Open(fName)
    if e != nil {
        log.Fatal(e)
    }
    h := sha1.New()
    _, e = io.Copy(h, f)
    if e != nil {
        log.Fatal(e)
    }
    return hex.EncodeToString(h.Sum(nil))
}

func main() {

    fmt.Println(md5s("Hello, Gopher!"))
    fmt.Println(md5f("E:\\testfile"))

    fmt.Println(sha1s("Hello, Gopher!"))
    fmt.Println(sha1f("E:\\testfile"))
}

版权声明:本文为u011304970原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。