code: def fingerprint(self):
      
      hasher = sha1()
      hasher.update(self.stable_name().encode('utf-8'))
      hasher.update(self._options_fingerprint(self.options_scope).encode('utf-8'))
      hasher.update(self.implementation_version_str().encode('utf-8'))
      for dep in self.subsystem_closure_iter():
        hasher.update(self._options_fingerprint(dep.options_scope).encode('utf-8'))
      return hasher.hexdigest() if PY3 else hasher.hexdigest().decode('utf-8')
docs: Returns a fingerprint for the identity of the task.
  
      A task fingerprint is composed of the options the task is currently running under.
      Useful for invalidating unchanging targets being executed beneath changing task
      options that affect outputted artifacts.
  
      A task's fingerprint is only valid after the task has been fully initialized.