Golang中MD5哈希编码问题如何解决

Golang中MD5哈希编码问题如何解决 大家好,

我是Go语言的新手,熟悉Java,我想理解这段代码想要做什么。 在第16行,我理解代码返回了MD5哈希值。 但是,谁能向我解释一下第20行?

https://play.golang.org/p/Dv0XlpTy5p5

此致, Nathan

6 回复

你好,Max,

我仍然很困惑,为什么在切掉前16个字符后,dM和dI的值仍然相同?

谢谢

更多关于Golang中MD5哈希编码问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


md5.Sum 返回一个 [16]byte,但示例中调用了 md5.New 来创建一个 hash.Hash,然后对其调用 Sum。也许它最初是从调用 md5.Sum 重构而来的。

据我所知,它只是返回 dM 的前 16 位。

参见 切片

它们相同是因为 MD5 摘要为 128 位,而 128 位等于 16 字节,所以获取一个 16 字节切片的前 16 字节没有任何作用。

至于为什么结果被切片为 16 字节,我完全不知道!

至于结果为什么被切片为16字节,我完全不知道!

这是将 md5.Sum 的结果(一个 [16]byte 数组)转换为切片。我认为更地道的做法是直接使用 [:] 来完成这个操作。

func main() {
    fmt.Println("hello world")
}

这是一个关于MD5哈希编码的常见问题。第20行将MD5哈希的字节切片转换为十六进制字符串表示。以下是详细解释:

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
)

func main() {
    data := []byte("hello world")
    
    // 第16行:计算MD5哈希
    hash := md5.Sum(data)
    // hash的类型是[16]byte(16字节的数组)
    
    // 第20行:将字节数组转换为十六进制字符串
    hexString := hex.EncodeToString(hash[:])
    // hash[:] 将数组转换为切片
    // hex.EncodeToString 将字节切片转换为十六进制字符串
    
    fmt.Printf("MD5哈希字节: %v\n", hash)
    fmt.Printf("十六进制字符串: %s\n", hexString)
    // 输出: 5eb63bbbe01eeed093cb22bb8f5acdc3
}

关键点:

  1. md5.Sum() 返回的是 [16]byte 固定长度数组
  2. hex.EncodeToString() 需要的是 []byte 切片
  3. hash[:] 将数组转换为切片,这是Go中数组到切片的常见转换方式
  4. 十六进制字符串表示是MD5哈希的标准显示格式

如果你需要将MD5哈希存储为字符串或进行比较,这种十六进制编码是必要的,因为直接比较字节数组不如比较字符串方便。

回到顶部