參考:https://studygolang.com/pkgdocgolang
導入方式:算法
import "hash"
hash包提供hash函數的接口。函數
type Hash interface { // 經過嵌入的匿名io.Writer接口的Write方法向hash中添加更多數據,永遠不返回錯誤 io.Writer // 返回添加b到當前的hash值後的新切片,不會改變底層的hash狀態 Sum(b []byte) []byte // 重設hash爲無數據輸入的狀態 Reset() // 返回Sum會返回的切片的長度 Size() int // 返回hash底層的塊大小;Write方法能夠接受任何大小的數據, // 但提供的數據是塊大小的倍數時效率更高 BlockSize() int }
Hash是一個被全部hash函數實現的公共接口。ui
sha256包中有一個方法:編碼
func New() hash.Hash
返回一個新的使用SHA256校驗算法的hash.Hash接口。spa
舉例:code
package main import ( "fmt" "crypto/sha256" "log" "encoding" "bytes" ) func main() { const ( input1 = "The tunneling gopher digs downwards, " input2 = "unaware of what he will find." ) first := sha256.New() first.Write([]byte(input1)) marshaler, ok := first.(encoding.BinaryMarshaler) //類型斷言 if !ok { log.Fatal("first does not implement encoding.BinaryMarshaler") } state, err := marshaler.MarshalBinary() //將其編碼成二進制形式 if err != nil { log.Fatal("unable to marshal hash:", err) } second := sha256.New() unmarshaler, ok := second.(encoding.BinaryUnmarshaler) if !ok { log.Fatal("second does not implement encoding.BinaryUnmarshaler") } if err := unmarshaler.UnmarshalBinary(state); err != nil {//將上面生成的二進制形式的state解碼成input1的值,並寫到unmarshaler中,這樣second中也有input1了 log.Fatal("unable to unmarshal hash:", err) } first.Write([]byte(input2)) second.Write([]byte(input2)) fmt.Printf("%x\n", first.Sum(nil))//57d51a066f3a39942649cd9a76c77e97ceab246756ff3888659e6aa5a07f4a52 fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil))) //true }
type Hash32 interface { Hash Sum32() uint32 }
Hash32是一個被全部32位hash函數實現的公共接口。blog
type Hash64 interface { Hash Sum64() uint64 }
Hash64是一個被全部64位hash函數實現的公共接口。接口