В Go1.13
у меня есть сервер загрузки. Этот сервер принимает 2 типа загрузки.
Chunked и Chunked + Threaded . При загрузке по частям все работает ожидаемо. Я вычисляю каждый кусок, пока они пишут на диск. Пользователь может загружать несколько блоков по очереди в хорошем порядке.
Это означает, что я могу сохранить состояние SHA1
каждого блока на диск, используя BinaryMarshaler
, затем прочитать предыдущее состояние и продолжить вычислять следующие блоки доЯ нахожу окончательный хэш. Финальный хеш дает мне отлично SHA1
всего файла.
Когда он упорядочен, я могу добавить к существующему состоянию. Но проблема начинается с многопоточности .... (Одновременно)
hashComplete := sha256.New()
// read previous sttate from disk
state, err := ioutil.ReadFile(ctxPath)
if err != nil {
return err
}
if len(state) > 0 {
unmarshaler, _ := hashComplete.(encoding.BinaryUnmarshaler)
if err := unmarshaler.UnmarshalBinary(state); err != nil {
return err
}
}
// In here im writing file to disk and hash. file object is simple File.
writer := io.MultiWriter(file, hashComplete)
n, err := io.Copy(writer, src) // src is source (io.Reader)
marshaler, _ := hashComplete.(encoding.BinaryMarshaler)
newState, err := marshaler.MarshalBinary()
if err != nil {
return err
}
shaCtxFile.Write(newState) // Here im saving last state to disk.
// Then later, after upload finishes, I read this file and get the SHA1 hex from it. It is correct.
Теперь это чанк-загрузка в определенном / хорошем порядке. Другой метод загрузки - Chunked + Threaded. Это означает, что пользователь может одновременно загружать порции, а затем отправлять запрос на их объединение в заданном порядке (по последнему запросу).
Я уже вычисляю SHA1
каждого порции и сохраняю его на диск.
Мой вопрос : возможно ли объединить эти состояния и получить окончательный хэш, или мне нужно перефразировать после объединения? Есть ли способ объединить эти состояния?