code: def fingerprint(self, field_keys=None):
      
      field_keys = frozenset(field_keys or self._fields.keys())
      if field_keys not in self._fingerprint_memo_map:
        self._fingerprint_memo_map[field_keys] = self._compute_fingerprint(field_keys)
      return self._fingerprint_memo_map[field_keys]
docs: A memoizing fingerprint that rolls together the fingerprints of underlying PayloadFields.
  
      If no fields were hashed (or all fields opted out of being hashed by returning `None`), then
      `fingerprint()` also returns `None`.
  
      :param iterable<string> field_keys: A subset of fields to use for the fingerprint.  Defaults
                                          to all fields.