Golang:从[]字节获取十六进制

25 hash gravatar go

http://play.golang.org/p/SKtaPFtnKO

func md(str string) []byte {
    h := md5.New()
    io.WriteString(h, str)

    fmt.Printf("%x", h.Sum(nil))
    // base 16, with lower-case letters for a-f
    return h.Sum(nil)
}
Run Code Online (Sandbox Code Playgroud)

我需要的是从输入字符串转换的Hash-key字符串.我能够以字节格式获取它,使用h.Sum(nil)并能够以%x格式打印出Hash密钥.但我想从此函数返回%x格式,以便我可以使用它将电子邮件地址转换为Hash密钥并使用它来访问Gravatar.com.

如何在Go中使用md5函数获取%x格式的哈希密钥?

谢谢,

fab*_*ioM 31

如果我理解正确,您想要返回%x格式:

您可以导入十六进制并使用该EncodeToString方法

str := hex.EncodeToString(h.Sum(nil))
Run Code Online (Sandbox Code Playgroud)

或者只是Sprintf的价值:

func md(str string) string {
    h := md5.New()
    io.WriteString(h, str)

    return fmt.Sprintf("%x", h.Sum(nil))
}
Run Code Online (Sandbox Code Playgroud)

请注意,Sprintf较慢,因为它需要解析格式字符串,然后根据找到的类型进行反映

http://play.golang.org/p/vsFariAvKo

  • 在我的基准测试中,`hex.EncodeToString`比`fmt`快约5倍 (5认同)
  • [hex.EncodeToString](http://golang.org/pkg/encoding/hex/#EncodeToString)可能稍微更高效(没有反射等). (3认同)

Luk*_*uke 15

你应该避免使用这个fmt包.该fmt软件包使用反射,除了调试之外,它还很昂贵.你知道你拥有什么,以及你想要转换成什么,所以你应该使用正确的转换包.

要从二进制转换为十六进制,然后返回,请使用encoding/hex包.

至十六进制string:

str := hex.EncodeToString(h.Sum(nil))
Run Code Online (Sandbox Code Playgroud)

来自Hex string:

b, err := hex.DecodeString(str)
Run Code Online (Sandbox Code Playgroud)

还有编码/解码功能[]byte.

当您需要转换为/从小数时使用strconv包.

从:intstring:

str := strconv.Itoa(100)
Run Code Online (Sandbox Code Playgroud)

从:stringint:

num, err := strconv.Atoi(str)
Run Code Online (Sandbox Code Playgroud)

此程序包中还有其他一些功能可以执行其他转换(基本等).

因此,除非您正在调试或格式化错误消息,否则请使用正确的转换.请.