淺析Go 字符串指紋
寫項(xiàng)目時(shí),有時(shí)我們需要緩存, 緩存就會(huì)需要唯一的key. 常規(guī)是對(duì)字符串求md5指紋. 在golang里我們也可以使用, 目前可以計(jì)算一個(gè)字符串的crc32, md5, sha1的指紋.
md5 : 一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)bai生出一個(gè)128位(du16字節(jié))的散列值(hash value),用于確保信息傳輸完整一zhi致。MD5由美國(guó)密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計(jì),于1992年公開,用以取代MD4算法。
sha1: SHA1是由NISTNSA設(shè)計(jì)為同DSA一起使用的,它對(duì)長(zhǎng)度小于264的輸入,產(chǎn)生長(zhǎng)度為160bit的散列值,因此抗窮舉(brute-force)性更好。SHA-1基于MD5,MD5又基于MD4。
crc32: 本身是“冗余校驗(yàn)碼”的意思,CRC32則表示會(huì)產(chǎn)生一個(gè)32bit(8位十六進(jìn)制數(shù))的校驗(yàn)值。由于CRC32產(chǎn)生校驗(yàn)值時(shí)源數(shù)據(jù)塊的每一個(gè)bit(位)都參與了計(jì)算,所以數(shù)據(jù)塊中即使只有一位發(fā)生了變化,也會(huì)得到不同的CRC32值。
golang 實(shí)現(xiàn)
md5
// md5值 func Md5Str(s string) string { hash := md5.Sum([]byte(s)) return hex.EncodeToString(hash[:]) }
sha1
// 散列值 func Sha1Str(s string) string { r := sha1.Sum([]byte(s)) return hex.EncodeToString(r[:]) }
crc32
// String hashes a string to a unique hashcode. // https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go // crc32 returns a uint32, but for our use we need // and non negative integer. Here we cast to an integer // and invert it if the result is negative. func HashCode(s string) int { v := int(crc32.ChecksumIEEE([]byte(s))) if v >= 0 { return v } if -v >= 0 { return -v } // v == MinInt return 0 } // Strings hashes a list of strings to a unique hashcode. func HashCodes(strings []string) string { var buf bytes.Buffer for _, s := range strings { buf.WriteString(fmt.Sprintf("%s-", s)) } return fmt.Sprintf("%d", HashCode(buf.String())) }
使用
func main() { // 2713056744 // 1f8689c0dd07ce42757ac01b1ea714f9 // 9addcbc6fee9c06f43d7110b657f3c61ff707032 txt := "https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go" fmt.Println(HashCode(txt)) fmt.Println(Md5Str(txt)) fmt.Println(Sha1Str(txt)) }
效率
得出效率: hash_code > md5 > sha1
const ( Txt = "https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go" ) // go test -test.bench=. -test.benchmem func BenchmarkMd5Str(b *testing.B) { for i := 0; i < b.N; i++ { Md5Str(Txt) } } func BenchmarkHashCode(b *testing.B) { for i := 0; i < b.N; i++ { HashCode(Txt) } } func BenchmarkSha1Str(b *testing.B) { for i := 0; i < b.N; i++ { Sha1Str(Txt) } } // BenchmarkMd5Str-8 2148428 518 ns/op 144 B/op 3 allocs/op // BenchmarkHashCode-8 8105571 160 ns/op 80 B/op 1 allocs/op // BenchmarkSha1Str-8 1836854 700 ns/op 176 B/op 3 allocs/op // 得出效率: hash_code > md5 > sha1
以上就是淺析Go 字符串指紋的詳細(xì)內(nèi)容,更多關(guān)于Go 字符串指紋的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Golang中的Unicode與字符串示例詳解
- 讓Django的BooleanField支持字符串形式的輸入方式
- go浮點(diǎn)數(shù)轉(zhuǎn)字符串保留小數(shù)點(diǎn)后N位的完美解決方法
- Go 驗(yàn)證字符串中是否包含中文(推薦)
- Golang中生成隨機(jī)字符串并復(fù)制到粘貼板的方法
- 分享6個(gè)Go處理字符串的技巧小結(jié)
- Go 高效截取字符串的一些思考
- Go 結(jié)構(gòu)體、數(shù)組、字典和 json 字符串的相互轉(zhuǎn)換方法
- 簡(jiǎn)單談?wù)凣olang中的字符串與字節(jié)數(shù)組
- Go語(yǔ)言中的字符串處理方法示例詳解
- Golang字符串的拼接方法匯總
- Golang 中整數(shù)轉(zhuǎn)字符串的方法
相關(guān)文章
Golang 使用Map實(shí)現(xiàn)去重與set的功能操作
這篇文章主要介紹了Golang 使用 Map 實(shí)現(xiàn)去重與 set 的功能操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04在go文件服務(wù)器加入http.StripPrefix的用途介紹
這篇文章主要介紹了在go文件服務(wù)器加入http.StripPrefix的用途介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12GOPROXY:解決go get golang.org/x包失敗問題
這篇文章主要介紹了GOPROXY:解決go get golang.org/x包失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01利用golang和shell計(jì)算一個(gè)字符串的md5值
這篇文章主要介紹了如何利用golang和shell計(jì)算一個(gè)字符串的md5值,我們先用shell來計(jì)算一下,再去判斷golang計(jì)算的md5值是否正確,文中有詳細(xì)的圖文介紹,需要的朋友可以參考下2024-03-03golang解析網(wǎng)頁(yè)利器goquery的使用方法
這篇文章主要給大家介紹了關(guān)于golang解析網(wǎng)頁(yè)利器goquery的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09剖析Go編寫的Socket服務(wù)器模塊解耦及基礎(chǔ)模塊的設(shè)計(jì)
這篇文章主要介紹了Go的Socket服務(wù)器模塊解耦及日志和定時(shí)任務(wù)的模塊設(shè)計(jì),舉了一些Go語(yǔ)言編寫的服務(wù)器模塊的例子,需要的朋友可以參考下2016-03-03