C# 使用StreamReader和Readline()为文件生成MD5值

C# 使用StreamReader和Readline()为文件生成MD5值,c#,md5,readline,C#,Md5,Readline,嗯。我的问题的不同方面在这个论坛上被多次询问和回答。然而,我不认为有人问过我这个问题的特殊变体。好了,就这样。我试图为同一个文本文件生成两个哈希值,以便在处理前和处理后比较数据文件。这一点疯狂的目的是验证整个文件是否已被程序读取和处理 我已经向自己证明,使用字节和数组将文件分成大块,然后使用MD5.TransformBlock将创建一个has值(程序代码遍布整个web)。当我运行程序时,两个散列值是相同的。但是,我使用StreamReader的readline()方法一次读取一行文本文件,这会生

嗯。我的问题的不同方面在这个论坛上被多次询问和回答。然而,我不认为有人问过我这个问题的特殊变体。好了,就这样。我试图为同一个文本文件生成两个哈希值,以便在处理前和处理后比较数据文件。这一点疯狂的目的是验证整个文件是否已被程序读取和处理

我已经向自己证明,使用字节和数组将文件分成大块,然后使用MD5.TransformBlock将创建一个has值(程序代码遍布整个web)。当我运行程序时,两个散列值是相同的。但是,我使用StreamReader的readline()方法一次读取一行文本文件,这会生成错误的哈希值

psuedo代码为:

BufferedStream reader = OpenFile(file)
string initialMd5 = generateMd5FromBufferedStream(reader)

//Start from the beginning again
reader.setposition = 0
reader.DiscardBufferedData();

while((tmpLine = reader.readline()) != null ) {
    Byte() buffer = GetBytes(tmpLine);
    md5.TransformBlock(buffer, 0, buffer.length, 0)
}

md5.TransformFinal(buffer, 0, 0);
String finalMd5 = ConvertToString(md5.Hash());
有什么想法吗?关于如何解决这个问题,我已经没有主意了


提前谢谢

这不是问题的答案,但检查文件的上次访问或修改日期是否足以检测更改。Net在System.IO命名空间中有一个FileInfo类,该类具有LastAccessTime和LastWriteTime的属性

所以,我在我的原始帖子中提到的原因,就是使用readline创建散列的原因,以便在读取和处理文件时生成散列。这个想法是,如果读取和处理文件后的散列与原始散列相同,那么我可以确信整个文件都已处理

我们遇到了StreamReader.ReadLine()无法读取整个文件的情况。由于某种原因,它只是在文件中间截断了。不过,这种行为是随机的。更糟糕的是,没有人提出错误!Supid.NET

无论如何,我的问题的答案是,当readline方法将字节数组(即文件中的一行文本)转换为字符串时,它将从字节数组中添加和减去“stuff”以执行转换。因此,经过大量的研究工作,答案似乎是在使用StreamReader.ReadLine读取文件时不可能生成准确的哈希


现在,如果有人想知道为什么愚蠢的东西会停止在中间读取文件…

< P>这是我们目前使用的。 用法:

using (StreamReader file = new StreamReader(filepath))
{
    // store checksum
    Checksum = file.BaseStream.ToMD5Hash(); 
    ....
}
扩展方法:

public static string ToMD5Hash(this System.IO.Stream stream)
{
    string hash = string.Empty;
    long position = stream.Position;

    // Initialize a hash object
    using (System.Security.Cryptography.MD5 myHasher = System.Security.Cryptography.MD5.Create())
    {
        // Be sure it's positioned to the beginning of the stream
        stream.Position = 0;

        // Compute the hash of the stream and convert to a string
        hash = myHasher.ComputeHash(stream).ByteArrayToString();
    }

    // reset location
    stream.Position = position;         

    return hash;
}

你为什么要涉及字符串呢?您应该直接读取流。可能readline正在删除行尾。如何处理带有0x0的字符串(结尾可能多次)?要验证这一点,只需读取一行并将其写入另一个文件-这将导致两个文件包含相同的内容,对吗然后比较这两个文件,你可能会发现不同。你如何计算从输入中读取的字节数?由于0x0的值,只有直接从输入读取的函数才能正常工作。
ReadLine
当然不包括行尾,没有“可能”的意思。这并不能回答前后文件是否相同的问题