Как вычеслить прогресс хеширования System.IO.Hashing?

Рейтинг: 0Ответов: 1Опубликовано: 15.03.2023

Хочу перейти с неофициальных реализаций хэш-функций на официальный System.IO.Hashing. Но я совершенно не понимаю, как сделать чтобы осуществлялся рапорт о прогрессе хэширования? Намерен использовать алгоритм XxHash3, но думаю что это не важно.

На данный момент я высчитываю хэш так (без отображения прогресса):

private string GetXxHash3(string filename)
{
    var hashAlgorithm = new XxHash3();
    using (Stream entryStream = System.IO.File.OpenRead(filename))
        hashAlgorithm.Append(entryStream);
    
    return BitConverter.ToString(hashAlgorithm.GetHashAndReset()).Replace("-", string.Empty);
}

Ответы

▲ 0Принят

Нашёл решение:

string GetXxHash3(string filename, IProgress<long> progress)
{
    var hashAlgorithm = new XxHash3();
    using (Stream entryStream = File.OpenRead(filename))
    {
        byte[] buffer = ArrayPool<byte>.Shared.Rent(4096); // use whatever chunk size you want
        int bytesRead;
        long totalRead = 0;
        while ((bytesRead = entryStream.Read(buffer)) > 0)
        {
            hashAlgorithm.Append(buffer.AsSpan(0, bytesRead));
            totalRead += bytesRead;
            progress.Report(totalRead);
        }
        ArrayPool<byte>.Shared.Return(buffer);
    }
    return Convert.ToHexString(hashAlgorithm.GetHashAndReset());
}