在 中Go1.13,我有一个上传服务器。该服务器接受 2 种上传类型。
分块和分块+线程。在分块上传上,一切都按预期进行。当它们写入磁盘时,我计算每个块。用户可以按照良好的顺序一一上传多个块。
这意味着,我可以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并将其保存到磁盘。
我的问题是可以组合这些状态并获得最终的哈希值,还是需要在连接后重新哈希。有没有办法结合这些状态?
梵蒂冈之花
相关分类