Как рассчитать SHA256 для очень большого файла в Go? - PullRequest
0 голосов
/ 20 февраля 2020

У меня очень большой файл, для которого мне нужно вычислить контрольную сумму в Go (от 30 до 200 ГБ). Я использовал обычную sha256sum программу для получения канонического ха sh данных, но при попытке сделать то же самое в Go я не смог получить тот же ха sh.

Я изначально начал с этой функции, которая работает точно так, как и предполагалось:

func checksum(file string) (string, error) {
    f, err := os.Open(file)
    if err != nil {
        return "", err
    }

    defer func() {
        _ = f.Close()
    }()

    copyBuf := make([]byte, 1024 * 1024)

    h := sha256.New()
    if _, err := io.CopyBuffer(h, f, copyBuf); err != nil {
        return "", err
    }

    return hex.EncodeToString(h.Sum(nil)), nil
}

Однако требования изменились, и мне нужно выполнить некоторую обработку в буфере, когда он читается, поэтому я изменил код так, чтобы что-то вроде этого. Однако теперь ха sh неверен, и я не уверен, что делаю неправильно.

    f, err := os.Open("<large file>")
    if err != nil {
        panic(err)
    }

    defer func() {
        _ = f.Close()
    }()

    buf := make([]byte, 1024 * 1024)
    h := sha256.New()

    for {
        bytesRead, err := f.Read(buf)
        if err != nil {
            if err != io.EOF {
                panic(err)
            }

            fmt.Println("EOF")
            break
        }

        // do some other work with buf before adding it to the hasher
        // processBuffer(buf)

        fmt.Printf("bytes read: %d\n", bytesRead)
        h.Write(buf)
    }

    fmt.Printf("checksum: %s\n", hex.EncodeToString(h.Sum(nil)))

Кто-нибудь знает, что я делаю не так?

1 Ответ

0 голосов
/ 20 февраля 2020

Я понял это. Мне нужно обрезать буфер перед записью:

h.Write(buf[:bytesRead]) вместо h.Write(buf)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...