'_HashBlock feeds data blocks into the hashers of fingers.
This function must be called before adjusting fingers for next
interval, otherwise the lack of remaining ranges will cause the
block not to be hashed for a specific finger.
Start and end are used to validate the expected ranges, to catch
unexpected use of that logic.
Args:
block: The data block.
start: Beginning offset of this block.
end: Offset of the next byte after the block.
Raises:
RuntimeError: If the provided and expected ranges don\'t match.'

def _HashBlock(self, block, start, end):

    for finger in self.fingers:
        expected_range = finger.CurrentRange()
        if (expected_range is None):
            continue
        if ((start > expected_range.start) or ((start == expected_range.start) and (end > expected_range.end)) or ((start < expected_range.start) and (end > expected_range.start))):
            raise RuntimeError('Cutting    across    fingers.')
        if (start == expected_range.start):
            finger.HashBlock(block)
