Я пытаюсь понять, как я могу читать содержимое файла, вычислять его хэш и возвращать его байты в один проход. До сих пор я делаю это в два этапа, например.Как вернуть хэш и байты в один шаг в Go?
// calculate file checksum
hasher := sha256.New()
f, err := os.Open(fname)
if err != nil {
msg := fmt.Sprintf("Unable to open file %s, %v", fname, err)
panic(msg)
}
defer f.Close()
b, err := io.Copy(hasher, f)
if err != nil {
panic(err)
}
cksum := hex.EncodeToString(hasher.Sum(nil))
// read again (!!!) to get data as bytes array
data, err := ioutil.ReadFile(fname)
Очевидно, что это не самый эффективный способ сделать это, так как чтение происходит дважды, один раз в виде копии, чтобы перейти к мясорубке, а другие в ioutil прочитать файл и вернуть список байт. Я изо всех сил пытаюсь понять, как объединить эти шаги вместе и сделать за один раз, прочитать данные один раз, вычислить любой хеш и вернуть его вместе со списком байтов на другой уровень.
Я разместил выше, io.Copy и io.Write предоставляет разные типы данных, int64 и int, поэтому результаты зависят от платформы. Как это решить? – Valentin
Если ваши файлы слишком велики для их размера, чтобы вписаться в int, вы не можете сделать байтовый кусок достаточно большим, чтобы держать свой контент в любом случае, так как длина фрагмента - это int. (И если вы работаете на 32-битной платформе, где это проблема, у вас, вероятно, недостаточно памяти для чтения большого файла.) – andybalholm