anchor.diff:        final sortedByTagNumbers = _sorted(extensions._tagNumbers);
         for (final tagNumber in sortedByTagNumbers) {
           final fi = extensions._getInfoOrNull(tagNumber)!;
  -        hash = hashField(hash, fi, extensions._getFieldOrNull(fi));
  +        hash = _hashField(hash, fi, extensions._getFieldOrNull(fi));
         }
       }
   
  
positive.code:     for (final fi in _infosSortedByTag) {
        final value = values[fi.index!];
        if (value == null) continue;
        hash = hashField(hash, fi, value);
      }
  
      // Hash with extension fields.
  
negative.code:     if (_isReadOnly && _hashCodesCanBeMemoized) {
        _frozenState = hash;
      }
      return hash;
    }
  
    // Hashes the value of one field (recursively).
    static int _hashField(int hash, FieldInfo fi, value) {
      if (value is List && value.isEmpty) {
        return hash; // It's either repeated or an empty byte array.
      }
  
      hash = _HashUtils._combine(hash, fi.tagNumber);
      if (_isBytes(fi.type)) {
        // Bytes are represented as a List<int> (Usually with byte-data).
        // We special case that to match our equality semantics.
        hash = _HashUtils._combine(hash, _HashUtils._hashObjects(value));
      } else if (!_isEnum(fi.type)) {
        hash = _HashUtils._combine(hash, value.hashCode);
      } else if (fi.isRepeated) {
        hash = _HashUtils._combine(
            hash, _HashUtils._hashObjects(value.map((enm) => enm.value)));
      } else {
        ProtobufEnum enm = value;
        hash = _HashUtils._combine(hash, enm.value);
      }
  
      return hash;
    }
  
  