@@ -221,7 +221,8 @@ def __getattr__(self, name):
221221 return getattr (self .message_pb , name )
222222
223223 def __hash__ (self ):
224- return hash (self .name )
224+ # Identity is sufficiently unambiguous.
225+ return hash (self .ident )
225226
226227 @utils .cached_property
227228 def field_types (self ) -> Sequence [Union ['MessageType' , 'EnumType' ]]:
@@ -238,15 +239,16 @@ def recursive_field_types(self) -> Sequence[
238239 Union ['MessageType' , 'EnumType' ]
239240 ]:
240241 """Return all composite fields used in this proto's messages."""
241- types : List [Union ['MessageType' , 'EnumType' ]] = []
242+ types : Set [Union ['MessageType' , 'EnumType' ]] = set ()
243+
242244 stack = [iter (self .fields .values ())]
243245 while stack :
244246 fields_iter = stack .pop ()
245247 for field in fields_iter :
246248 if field .message and field .type not in types :
247249 stack .append (iter (field .message .fields .values ()))
248250 if not field .is_primitive :
249- types .append (field .type )
251+ types .add (field .type )
250252
251253 return tuple (types )
252254
@@ -391,6 +393,10 @@ class EnumType:
391393 default_factory = metadata .Metadata ,
392394 )
393395
396+ def __hash__ (self ):
397+ # Identity is sufficiently unambiguous.
398+ return hash (self .ident )
399+
394400 def __getattr__ (self , name ):
395401 return getattr (self .enum_pb , name )
396402
0 commit comments