這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
介紹雜湊函數之前,先說一下Golang的雜湊結果。在包/hash/
下的hash.go檔案,定義了雜湊函數的介面。所有雜湊函數都要實現此介面。
// Hash is the common interface implemented by all hash functions.type Hash interface {// Write (via the embedded io.Writer interface) adds more data to the running hash.// It never returns an error.io.Writer// Sum appends the current hash to b and returns the resulting slice.// It does not change the underlying hash state.Sum(b []byte) []byte// Reset resets the Hash to its initial state.Reset()// Size returns the number of bytes Sum will return.Size() int// BlockSize returns the hash's underlying block size.// The Write method must be able to accept any amount// of data, but it may operate more efficiently if all writes// are a multiple of the block size.BlockSize() int}
此介面提供了常用的Sum
等函數,此外,它還繼承了io.Writer
介面。該介面定義在io
包裡的io.go檔案裡。該介面定義了Write
寫入函數。
// Writer is the interface that wraps the basic Write method.//// Write writes len(p) bytes from p to the underlying data stream.// It returns the number of bytes written from p (0 <= n <= len(p))// and any error encountered that caused the write to stop early.// Write must return a non-nil error if it returns n < len(p).type Writer interface {Write(p []byte) (n int, err error)}
常見的雜湊函數調用過程大體如此,初始化hash.Hash之後,通過Write
寫入資料,通過Sum
函數得到雜湊結果。其中,Sum(b []byte) []byte
函數的參數b,當傳入nil
的時候,將直接返回雜湊結果,而b不為空白的時候,就會將雜湊結果追加到b後面。
MD5的密碼編譯演算法調用如下,源碼:
package mainimport ("crypto/md5""encoding/hex")func main() {m := md5.New()m.Write([]byte("hello, world"))s := hex.EncodeToString(m.Sum(nil))println(s)}
FNV的加密調用也很簡單,源碼。fnv.New32()
使用的是32位的FNV-1演算法進行的雜湊。
package mainimport "fmt"import "hash/fnv"import "encoding/hex"func main() {a := fnv.New32()a.Write([]byte("hello"))fmt.Println(hex.EncodeToString(a.Sum(nil)))}
FNV是一種非加密的雜湊演算法,支援32位、64位、128位、256位、512位和1024位的雜湊。碰撞還算比較低,具體的碰撞的對比可以網上查一下。
直接雜湊得到的都是整數類型,直接輸出的話就會是亂碼了,如果想查看正常的雜湊結果,需要將結果轉成對應表示的字元即可。使用包encoding/hex
可以協助實現十六進位編碼。
補充一下。。。基礎不好的坑自己。。。
MD5加密結果是32個16進位數,而一個位元組能表示的範圍是0~255,256=16×16,也就是兩個十六進位數代表一個位元組。所以Sum
函數得到的byte數組長度是16,糾結了我半天。。。
######參考文獻+ 【1】Package fnv - The Go Programming Language+ 【2】Fowler–Noll–Vo hash function - wikipedia+ 【3】FNV雜湊演算法 - 思思入code
原文連結:常見雜湊函數FNV和MD5,轉載請註明來源!