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 格式的哈希键?
谢谢,
如果我理解正确,你想返回 %x 格式:
您可以
import "encoding/hex"
并使用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 速度较慢,因为它需要解析格式字符串,然后根据找到的类型进行反射
您应该避免使用
fmt
包来实现此目的。 fmt
包使用反射,除了调试之外,它的成本很高。您知道自己拥有什么,以及想要转换成什么,所以您应该使用正确的转换包。
要从二进制转换为十六进制,然后再转换回来,请使用 encoding/hex 包。
转十六进制
string
:
str := hex.EncodeToString(h.Sum(nil))
来自十六进制
string
:
b, err := hex.DecodeString(str)
还有
[]byte
的编码/解码功能。
当您需要与十进制之间进行转换时,请使用 strconv 包。
从
int
到string
:
str := strconv.Itoa(100)
从
string
到int
:
num, err := strconv.Atoi(str)
此包中还有其他几个函数可以执行其他转换(基数等)。
因此,除非您正在调试或格式化错误消息,否则使用正确的转换。请。
所提供的一些解决方案在涉及的最大允许数量方面存在限制。
我已经阅读了 Luke 写的关于使用 fmt 包的内容,但我仍然喜欢在此页面添加替代解决方案,因为我没有看到任何人提供此特定方法,它实际上只有 3 行,我非常确定此解决方案将对于将来访问此页面的某些人也很有用。
package main
import(
"fmt"
"math/big"
)
func main() {
newbytes := []byte{159,127,208,150,211,126,210,192,227,247,240,207,201,36,190,239,79,252,235,104}
newkey := new(big.Int).SetBytes(newbytes)
fmt.Printf("%X \n", newkey)
}
或者如果您只需要抓住绳子
package main
import(
"fmt"
"math/big"
)
func getHexString(bytesl []byte) (string) {
newkey := new(big.Int).SetBytes(bytesl)
base16str := fmt.Sprintf("%X",newkey)
return base16str
}
func main() {
newbytes := []byte{159,127,208,150,211,126,210,192,227,247,240,207,201,36,190,239,79,252,235,104}
hexstr := getHexString(newbytes)
fmt.Println(hexstr)
}
需要明确的是,我并不是说这是一个好的或最好的方法,因为这通常取决于项目环境,所以我只是为了完整性和演示目的而添加它。