Я переписываю свое приложение для скорости. В основном он использует шаблон «производитель / потребитель» для обработки данных файла, например, для параллельного вычисления нескольких хешей.
Одним из изменений было переключение с 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);
}