为了账号安全,请及时绑定邮箱和手机立即绑定

字符串的哈希原型对象作为 redis 数据库的键

字符串的哈希原型对象作为 redis 数据库的键

Go
HUWWW 2022-09-26 17:38:35
我有某种复杂的原型对象。这是发送到我的 GRPC 终结点的请求。如果我以前没有处理它,我只想处理它。因此,我想将对象散列为某个字符串,并将其存储在我的 Redis 数据库中。我使用了对象哈希原型,但是对于新版本的原始编译器,我得到了这个错误:got an unexpected struct of type 'impl.MessageState' for field {Name:state PkgPath:... Type:impl.MessageState Tag: Offset:0 Index:[0] Anonymous:false}似乎它不支持结构,新版本的protobuf编译器生成包含结构的代码。我无法为每个请求生成某种 ID。ID 实际上是整个对象的哈希值。
查看完整描述

2 回答

?
UYOU

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


查看完整回答
反对 回复 2022-09-26
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

Proto 序列化不稳定,因此您不能依赖对输出进行封送处理和散列来为同一条消息生成相同的哈希值。

从 https://developers.google.com/protocol-buffers/docs/reference/go/faq#hash

如何使用协议缓冲区消息作为哈希键?

您需要规范序列化,其中协议缓冲区消息的封送处理输出保证随时间稳定。遗憾的是,目前尚不存在规范序列化规范。你需要写自己的,或者找到一种方法来避免需要一个。

我能找到的最接近的解决方案是Deepmind对象哈希原型,但在过去的4年里没有贡献,所以我认为它可能已经过时了。


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号