Использование Hashalgorithm с ReadOnlySpan <byte> - PullRequest
1 голос
/ 19 мая 2019

Я переписываю свое приложение для скорости. В основном он использует шаблон «производитель / потребитель» для обработки данных файла, например, для параллельного вычисления нескольких хешей.

Одним из изменений было переключение с byte [] Blocks на ReadOnlySpan. Это привело к некоторым хорошим ускорениям и упрощению кода.

Есть только один улов мэра:
Мне пришлось удалить все HashAlgorithm, поддерживаемые платформой, так как на данный момент они не поддерживают обработку частичных данных Span. Удалите их или понесете штраф за копирование данных в байтовые массивы. Единственный метод, который поддерживает Span, это TryComputeHash, который хочет получить полные данные. Поскольку обрабатываемые файлы могут быть очень большими, это бесполезно для меня.

Так вот мой актуальный вопрос:
Есть ли какой-либо (возможно, небезопасный) "хак", который я мог бы использовать для передачи данных Span в объекты HashAlgorithm?

protected override void DoWork(CancellationToken ct) {
    HashAlgorithm.Initialize();

    ReadOnlySpan<byte> block;
    int bytesProcessed;
    do {
        ct.ThrowIfCancellationRequested();

        block = Reader.GetBlock(ReadLength);
        //Make this work
        bytesProcessed = HashAlgorithm.TransformBlock((byte[])block, 0, block.Length, null, 0); 
    } while(Reader.Advance(bytesProcessed) && bytesProcessed != 0);

    var lastBytes = block.Length - bytesProcessed;
    //Make this work
    HashValue = HashAlgorithm.TransformFinalBlock((byte[])block.Slice(bytesProcessed, lastBytes), 0, lastBytes).ToArray(); 
    Reader.Advance(lastBytes);
}
...