2 回答
TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果你有一個(gè)[1],那么你可以免費(fèi)獲得一個(gè)元帥函數(shù)[2]。因此,在封送消息后,只需將字節(jié)傳遞給 或 所需的任何內(nèi)容: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貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
Proto 序列化不穩(wěn)定,因此您不能依賴(lài)對(duì)輸出進(jìn)行封送處理和散列來(lái)為同一條消息生成相同的哈希值。
從 https://developers.google.com/protocol-buffers/docs/reference/go/faq#hash
如何使用協(xié)議緩沖區(qū)消息作為哈希鍵?
您需要規(guī)范序列化,其中協(xié)議緩沖區(qū)消息的封送處理輸出保證隨時(shí)間穩(wěn)定。遺憾的是,目前尚不存在規(guī)范序列化規(guī)范。你需要寫(xiě)自己的,或者找到一種方法來(lái)避免需要一個(gè)。
我能找到的最接近的解決方案是Deepmind對(duì)象哈希原型,但在過(guò)去的4年里沒(méi)有貢獻(xiàn),所以我認(rèn)為它可能已經(jīng)過(guò)時(shí)了。
- 2 回答
- 0 關(guān)注
- 107 瀏覽
添加回答
舉報(bào)
