<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fingerprint(self, field_keys=None):
 """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. """

    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]