2 回答

TA贡献1878条经验 获得超4个赞
如果你有一个[1],那么你可以免费获得一个元帅函数[2]。因此,在封送消息后,只需将字节传递给 或 所需的任何内容:proto.Messagebase64md5
package main
import (
"encoding/base64"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/structpb"
)
func hash(m proto.Message) (string, error) {
b, err := proto.Marshal(m)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(b), nil
}
func main() {
m, err := structpb.NewStruct(map[string]interface{}{
"month": 12, "day": 31,
})
if err != nil {
panic(err)
}
s, err := hash(m)
if err != nil {
panic(err)
}
println(s) // ChIKBW1vbnRoEgkRAAAAAAAAKEAKEAoDZGF5EgkRAAAAAAAAP0A=
}
https://godocs.io/google.golang.org/protobuf/proto#Message
https://godocs.io/google.golang.org/protobuf/proto#Marshal

TA贡献1850条经验 获得超11个赞
Proto 序列化不稳定,因此您不能依赖对输出进行封送处理和散列来为同一条消息生成相同的哈希值。
从 https://developers.google.com/protocol-buffers/docs/reference/go/faq#hash
如何使用协议缓冲区消息作为哈希键?
您需要规范序列化,其中协议缓冲区消息的封送处理输出保证随时间稳定。遗憾的是,目前尚不存在规范序列化规范。你需要写自己的,或者找到一种方法来避免需要一个。
我能找到的最接近的解决方案是Deepmind对象哈希原型,但在过去的4年里没有贡献,所以我认为它可能已经过时了。
- 2 回答
- 0 关注
- 106 浏览
添加回答
举报