【问题标题】:How to go from []bytes to get hexadecimal如何从 []bytes 获取十六进制
【发布时间】:2019-06-29 20:56: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 格式,以便我可以使用它将电子邮件地址转换为哈希键并使用它来访问 Gravatar.com。

如何在 Go 中使用 md5 函数获取 %x 格式的 Hash-key?

谢谢,

【问题讨论】:

    标签: hash go gravatar


    【解决方案1】:

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

    【讨论】:

    • hex.EncodeToString 可能效率更高一些(没有反射等)。
    • 在我的基准测试中,hex.EncodeToStringfmt 快 5 倍
    • 也许只有我一个人,但%x 给了我空的输出,hex.EncodeToString 有预期的输出。
    • "you can import hex" --"you can import encoding/hex"会更好
    【解决方案2】:

    您应该避免为此使用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)
    

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2019-04-13
      • 2013-12-02
      相关资源
      最近更新 更多