将Hashalgorithm与ReadOnlySpan <byte>

时间:2019-05-18 21:14:29

标签: c# html hash .net-core unsafe

为了提高速度,我正在重写我的应用程序。它基本上使用生产者/消费者模式来处理文件数据,以并行计算例如多个哈希。

其中一项更改是从byte []块切换到ReadOnlySpan。这样可以提高速度,并简化代码。

市长只有一个:
我必须删除框架支持的所有HashAlgorithms,因为到目前为止它们还不支持处理部分Span数据。删除它们或将数据复制到字节数组会受到惩罚。 支持Span的唯一方法是TryComputeHash,它需要完整的数据。 由于要处理的文件可能很大,所以对我来说这没有用。

这是我的实际问题:
是否可以使用任何(可能不安全的)“ hack”将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);
}

1 个答案:

答案 0 :(得分:0)

建议您使用

incrementalhash。它可以处理Span<byte>类型的连续数据。