浅析Go 字符串指纹
写项目时,有时我们需要缓存,缓存就会需要唯一的key.常规是对字符串求md5指纹.在golang里我们也可以使用,目前可以计算一个字符串的crc32,md5,sha1的指纹.
md5:一种被广泛使用的密码散列函数,可以产bai生出一个128位(du16字节)的散列值(hashvalue),用于确保信息传输完整一zhi致。MD5由美国密码学家罗纳德·李维斯特(RonaldLinnRivest)设计,于1992年公开,用以取代MD4算法。
sha1:SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1基于MD5,MD5又基于MD4。
crc32:本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。由于CRC32产生校验值时源数据块的每一个bit(位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的CRC32值。
golang实现
md5
//md5值 funcMd5Str(sstring)string{ hash:=md5.Sum([]byte(s)) returnhex.EncodeToString(hash[:]) }
sha1
//散列值 funcSha1Str(sstring)string{ r:=sha1.Sum([]byte(s)) returnhex.EncodeToString(r[:]) }
crc32
//Stringhashesastringtoauniquehashcode. //https://github.com/hashicorp/terraform/blob/master/helper/hashcode/hashcode.go //crc32returnsauint32,butforouruseweneed //andnonnegativeinteger.Herewecasttoaninteger //andinvertitiftheresultisnegative. funcHashCode(sstring)int{ v:=int(crc32.ChecksumIEEE([]byte(s))) ifv>=0{ returnv } if-v>=0{ return-v } //v==MinInt return0 } //Stringshashesalistofstringstoauniquehashcode. funcHashCodes(strings[]string)string{ varbufbytes.Buffer for_,s:=rangestrings{ buf.WriteString(fmt.Sprintf("%s-",s)) } returnfmt.Sprintf("%d",HashCode(buf.String())) }
使用
funcmain(){ //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" ) //gotest-test.bench=.-test.benchmem funcBenchmarkMd5Str(b*testing.B){ fori:=0;imd5>sha1
以上就是浅析Go字符串指纹的详细内容,更多关于Go字符串指纹的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。