计算部分流的MD5哈希值

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我有一个以自定义文件格式存储的大型数据集(~1GB),其后16个字节是文件所有先前字节的MD5哈希值。

我想使用HashAlgorithm.ComputeHash(Stream)对嵌入式MD5验证此文件的MD5,但是这将计算整个文件的哈希值,包括最后16字节中的哈希值,这显然不会起作用。

如何计算流的PART的MD5哈希值?我知道我可以将流读入数组并将其传递给HashAlgorithm.ComputeHash(字节),但是在内存中复制这1GB数据的开销是令人望而却步的。

提问于
用户回答回答于

我发现自己在6个月内第二次需要这个,所以发布我的解决方案以获得部分输入流。

class PartialStream: Stream {
    public Stream Source { get; }
    public long Offset { get; }
    public override long Length { get; }

    private long End => Offset + Length;

    public override bool CanRead => true;

    public override bool CanSeek => false;

    public override bool CanWrite => false;

    public override long Position {
        get => Source.Position - Offset;
        set => throw new NotSupportedException();
    }

    public PartialStream(Stream source, long length) {
        Offset = source.Position;
        Length = length;
    }

    public PartialStream(Stream source, long offset, long length, bool seekToOffset = true) {
        if (seekToOffset) source.Seek(offset, SeekOrigin.Begin);
        Offset = offset;
        Length = length;
    }

    public override int Read(byte[] array, int offset, int count) {
        if (Source.Position >= End) return 0;

        if (Source.Position + count > End)
            count = (int)(End - Source.Position);

        return Source.Read(array, offset, count);
    }

    public override void Flush() => throw new NotSupportedException();
    public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
    public override void SetLength(long value) => throw new NotSupportedException();
    public override void Write(byte[] buffer, int offset, int count) => throw new NotSupportedException();
}
用户回答回答于

扫码关注云+社区

领取腾讯云代金券