code: def HashIt(self):
      
      while True:
        interval = self._GetNextInterval()
        if interval is None:
          break
        self.file.seek(interval.start, os.SEEK_SET)
        block = self.file.read(interval.end - interval.start)
        if len(block) != interval.end - interval.start:
          raise RuntimeError('Short read on file.')
        self._HashBlock(block, interval.start, interval.end)
        self._AdjustIntervals(interval.start, interval.end)
  
      results = []
      for finger in self.fingers:
        res = {}
        leftover = finger.CurrentRange()
        if leftover:
          if (len(finger.ranges) > 1 or leftover.start != self.filelength or
              leftover.end != self.filelength):
            raise RuntimeError('Non-empty range remains.')
        res.update(finger.metadata)
        for hasher in finger.hashers:
          res[hasher.name] = hasher.digest()
        results.append(res)
  
      # Clean out things for a fresh start (on the same file object).
      self.fingers = []
  
      # Make sure the results come back in 'standard' order, regardless of the
      # order in which fingers were added. Helps with reproducing test results.
      return sorted(results, key=lambda r: r['name'])
docs: Finalizing function for the Fingerprint class.
  
      This method applies all the different hash functions over the
      previously specified different ranges of the input file, and
      computes the resulting hashes.
  
      After calling HashIt, the state of the object is reset to its
      initial state, with no fingers defined.
  
      Returns:
        An array of dicts, with each dict containing name of fingerprint
        type, names of hashes and values, and additional, type-dependent
        key / value pairs, such as an array of SignedData tuples for the
        PE/COFF fingerprint type.
  
      Raises:
         RuntimeError: when internal inconsistencies occur.