我正在改写我的申请以求速度。它基本上使用生产者/消费者模式来处理文件数据,例如并行计算多个散列。
其中一个更改是从byte[]块切换到ReadOnlySpan。这导致了一些不错的加速和代码简化。
这里只有一个市长的陷阱:
我不得不删除框架支持的所有HashAlgorithms,因为到目前为止,它们还不支持处理部分Span数据。如果将数据复制到字节数组中,则要删除它们,否则将受到损失。唯一支持Span的方法是TryComputeHash,它需要完整的数据。由于要处理的文件可能很大,这对我来说是没有用的。
我的问题是:
有什么(可能是不安全的)“黑客”可以用来将跨范围数据传递给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);
}发布于 2019-11-07 10:09:27
对于您的情况,建议使用增量散列。它可以用Span<byte>类型的连续数据进行处理。
https://stackoverflow.com/questions/56202907
复制相似问题