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