首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >计算部分流的MD5散列

计算部分流的MD5散列
EN

Stack Overflow用户
提问于 2011-05-18 15:12:29
回答 3查看 2.9K关注 0票数 7

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

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

如何计算部分流的MD5哈希值?我知道我可以将流读入一个数组并将其传递给HashAlgorithm.ComputeHash(字节),但是在内存中复制这1 1GB数据的开销是很高的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-18 15:20:59

取自here,在那里您还可以获得其他方法。

创建一个部分文件流类,读取你想要的大小,并对其进行散列。

代码语言:javascript
复制
 class PartialFileStream : FileStream
{
    public PartialFileStream(string path, FileMode mode, long startPosition, long endPosition): base(path, mode)
{
  base.Seek(startPosition, SeekOrigin.Begin);
  ReadTillPosition = endPosition;
}

public long ReadTillPosition { get; set; }

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

 if (base.Position + count > this.ReadTillPosition)
   count = (int)(this.ReadTillPosition - base.Position);

 return base.Read(array, offset, count);
  }
}
票数 5
EN

Stack Overflow用户

发布于 2011-05-18 15:22:28

您可以使用FileStream.Seek选项查找到流的特定位置并从中读取。

票数 0
EN

Stack Overflow用户

发布于 2019-06-13 07:30:33

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

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6041117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档