docs: def read_sha1(
      file_path,
      buf_size = None,
      start_byte = 0,
      read_size = None,
      extra_hashers = [], # update(data) will be called on all of these
  ):
      '''
      Determines the sha1 hash of a file in chunks, to prevent loading the entire file at once into memory
      '''
      read_size = read_size or os.stat(file_path).st_size
      buf_size = buf_size or DEFAULT_BUFFER_SIZE
  
      data_read = 0
      total_sha1 = hashlib.sha1()
      while data_read < read_size:
          with open( file_path, 'rb', buffering = 0 ) as f:
              f.seek( start_byte )
              data = f.read( min(buf_size, read_size - data_read) )
              assert( len(data) > 0 )
              total_sha1.update( data )
              for hasher in extra_hashers:
                  hasher.update( data )
              data_read += len(data)
              start_byte += len(data)
      assert( data_read == read_size )
  
      return total_sha1