code: 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)
docs: _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.