43

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

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

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

谢谢,

4

2 回答 2

50

如果我理解正确,您想返回 %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

于 2013-10-12T00:09:31.760 回答
20

你应该避免使用这个fmt包。该fmt包使用反射,除了调试之外,它的成本很高。你知道你有什么,你想转换成什么,所以你应该使用正确的转换包。

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

到十六进制string

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

从十六进制string

b, err := hex.DecodeString(str)

也有编码/解码功能[]byte

当您需要从十进制转换为 / 时,请使用strconv包。

intstring:

str := strconv.Itoa(100)

stringint:

num, err := strconv.Atoi(str)

此包中还有其他几个函数可以进行其他转换(基础等)。

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

于 2013-10-13T16:41:56.070 回答