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/adler32
、hash/crc32
和hash/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 中重新迭代时获取额外的空字节