20210329写go authcode后的一些总结 - ziyouzy/2021blog GitHub Wiki
有一个前辈所写的md5包挺好的:
https://github.com/flysion/go-authcode/blob/master/md5/hex.go
package md5
import (
"fmt"
"crypto/md5"
)
func HexBB(str []byte) []byte {
return []byte(fmt.Sprintf("%x", md5.Sum(str)))
}
func HexBS(str []byte) string {
return fmt.Sprintf("%x", md5.Sum(str))
}
func HexSS(str string) string {
return fmt.Sprintf("%x", md5.Sum([]byte(str)))
}
func HexSB(str string) []byte {
return []byte(fmt.Sprintf("%x", md5.Sum([]byte(str))))
}
同样对输出形式进行了特殊的设计:
BS代表BytestoString,SS代表StringtoString,等等,值得注意的是所有的转换工序在返回前都使用了字符串工具fmt.Sprintf("%x", md5.Sum(baits))
这是因为md5.Sum(baits)的结果会是一个8位原始的字节序列,而大众对于md5码的认知普遍是一个“16位的字符串”
重点在于,怎么才能优雅的实现这个8位原始的字节序列与16位的字符串之间的转换工作?
首先你会想到的是string(baits)但是显然是不行的,只能转换成一个长度位8的字符串;
另一种方式就是fmt.Sprintf("%x", md5.Sum(baits))了
先说个细节,也就是数组转切片最省事的办法:
baitsx =arr[:]
这是个贼省事的办法!!!!
两者演示如下:
baits := []byte{0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04,0x01,0x02,0x03,0x04}
arr :=md5.Sum(baits)//转化的结果是数组而不是切片,内置方法之所以这么设计其实也是为了节省开销
fmt.Println("1:",arr[:])
fmt.Println("2:",string(arr[:]))
fmt.Println("3:",fmt.Sprintf("%x",arr[:]))
1: [221 95 80 65 241 71 150 244 63 62 149 39 207 118 238 215]
2: �_PA�G��?>�'�v��
3: dd5f5041f14796f43f3e9527cf76eed7
可以看出,打印最原始的切片会直接显示具体的“十六进制整型”
直接string转化则会转化成乱码,因为转化的过程会直接与utf8表或ascii表进行强行匹配,无论这个整数是否存在于表内
第三种情况则是进行了hex转化,等同于hex.EncodeingtoString(arr[:]),不过看上去似乎fmt.Sprintf("%x",arr[:])更为高效
同时这两个方法的结果都会是个string整型,所以一旦8位的原始数据无法解决使用场景的问题了,必须使用16进制的形式处理问题
那么就使用fmt.Sprintf("%x",arr[:])吧
确实有可以优化的地方,现在就开始优化