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

时间:2013-10-11 23:56:36

标签: hash go gravatar

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)
}

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

如何在Go?

中使用md5函数获取%x格式的哈希密钥

谢谢,

2 个答案:

答案 0 :(得分:29)

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

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

str := hex.EncodeToString(h.Sum(nil))

或只是Sprintf的值:

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

    return fmt.Sprintf("%x", h.Sum(nil))
}

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

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

答案 1 :(得分:15)

您应该避免使用fmt包。 fmt包使用反射,除了调试之外的其他任何东西都很昂贵。你知道你拥有什么,以及你想要转换成什么,所以你应该使用正确的转换包。

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

至十六进制string

str := hex.EncodeToString(h.Sum(nil))

来自Hex string

b, err := hex.DecodeString(str)

还有[]byte的编码/解码功能。

当您需要转换为小数时,请使用strconv包。

intstring

str := strconv.Itoa(100)

stringint

num, err := strconv.Atoi(str)

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

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

相关问题