python-3.x 如何在protobuf消息中实现hash方法?

ulydmbyx  于 2023-05-23  发布在  Python
关注(0)|答案(1)|浏览(197)

我创建了一个Message.proto文件,并将其编译为python文件,命名为message_pb2。然后在一个场景中,我想把我的消息对象放到一个集合中,以使它们唯一。但是protobuf消息的__hash__函数引发了TypeError,那么我想我可以在代码中实现并覆盖这个函数。
我创建了一个继承message_pb2.Message()的新类,但是在运行代码时,我得到了另一个错误:

KeyError: 'DESCRIPTOR'

现在我没有别的办法了!

fiei3ece

fiei3ece1#

是的,你是对的。我做了一些修改,并使用下面的代码,它的工作:

import hashlib
from myproto_pb2 import MyMessage  # Import your generated protobuf message class

class HashableMessage:
    def __init__(self, message):
        self._message = message

    def __hash__(self):
        # Define the fields to include in the hash calculation
        fields_to_hash = [self._message.field1, self._message.field2, self._message.field3]

        # Convert the field values to bytes and concatenate them
        data = b"".join(str(field).encode() for field in fields_to_hash)

        # Calculate the hash value using SHA-256
        hash_value = hashlib.sha256(data).hexdigest()

        return int(hash_value, 16)  # Convert the hex hash to an integer

    def __eq__(self, other):
        return isinstance(other, HashableMessage) and self._message == other._message

# Create a set to store protobuf messages
message_set = set()

# Create an instance of the protobuf message
protobuf_message1 = MyMessage()
protobuf_message1.field1 = "value1"
protobuf_message1.field2 = 42
protobuf_message1.field3 = True

message_set.add(HashableMessage(protobuf_message1))

相关问题