Golang 字节数组 - 获取校验和

Posted

技术标签:

【中文标题】Golang 字节数组 - 获取校验和【英文标题】:checksum of a byte array 【发布时间】:2021-11-29 15:04:32 【问题描述】:

我有一个字节数组,由一个字符串组成:

    array := []byte("some string")

看起来像预期的那样:

    [115 111 109 101 32 115 116 114 105 110 103]

从 python 开始,我认为有更好的方法,而不是类似的方法:

    func sum(array []int) int   
      result := 0  
      for _, v := range array   
        result += v  
          
      return result  
    

(以上失败,因为数字不是整数,所以这需要另一个数据转换)

有没有办法简单地获取字节数组的校验和?

喜欢:

    sum(array)

【问题讨论】:

如果您想简单地将单个字节求和为整数,请执行以下操作:play.golang.org/p/kG_BomiGQ9v。还有hash/adler32hash/crc32hash/crc64 @mkopriva 谢谢! 这里更大的目标是什么?示例字符串是简单的 ASCII 格式。 Go 字符串可以包含任何 UTF8 字符,因此单个符文可以跨越多个字节。 @colm.anseo 我将其用作 FIX 消息的校验和:en.wikipedia.org/wiki/… @gg 编辑问题以说明您要计算 FIX 消息总和。这将省去人们编写无法解决您的问题的答案的麻烦。 【参考方案1】:

也许您需要 md5.sum 来检查可靠性。

https://pkg.go.dev/crypto/md5#Sum

package main

import (
    "crypto/md5"
    "fmt"
)

func main() 
    data := []byte("some string")
    fmt.Printf("%x", md5.Sum(data))

另一个例子。

https://play.golang.org/p/7_ctunsqHS3

【讨论】:

【参考方案2】:
package main

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

func GetMD5HashWithSum(text string) string 
    hash := md5.Sum([]byte(text))
    return hex.EncodeToString(hash[:])


func main() 
    hello := GetMD5HashWithSum("some string")
    fmt.Println(hello)

您可以在Golang Playground上获得它

【讨论】:

【参考方案3】:

我认为尽可能避免使用fmt 进行转换是件好事:

package main

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

func checksum(s string) string 
   b := md5.Sum([]byte(s))
   return hex.EncodeToString(b[:])


func main() 
   s := checksum("some string")
   println(s == "5ac749fbeec93607fc28d666be85e73a")

https://godocs.io/crypto/md5#Sum

【讨论】:

以上是关于Golang 字节数组 - 获取校验和的主要内容,如果未能解决你的问题,请参考以下文章

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

如何在golang中将字节附加到字节数组?不是字节数组到字节数组切片等[重复]

将任意 Golang 接口转换为字节数组

golang将字节数组转换为结构

如何在golang中将切片附加到字节数组

golang 字节数组对比函数