常見雜湊函數FNV和MD5

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

介紹雜湊函數之前,先說一下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,轉載請註明來源!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.