'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.'

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)
    self.fingers = []
    return sorted(results, key=(lambda r: r['name']))
