如何在文件上执行SHA1哈希?

5
如果我有一个文件想要监视其任何更改(而不是查看文件日期戳等),我该如何对其内容执行SHA1哈希运算?我认为这就是GIT所做的事情,所以我只是想学习如何做。

3
你为什么不直接使用FileSystemWatcher呢?这个类可以监视文件系统中的更改。http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx - user1228
2
因为它当然不能工作。只能在某些受支持的文件系统上工作。 - Stephan Eggermont
@Will 即使在支持的文件系统上,也不能保证触发(缓冲区大小有限)。 - vossad01
@vossad01 很不幸,但是事实如此。 - user1228
2个回答

22
using (FileStream stream = File.OpenRead(@"C:\File.ext"))
{
    using (SHA1Managed sha = new SHA1Managed())
    {
        byte[] checksum = sha.ComputeHash(stream);
        string sendCheckSum = BitConverter.ToString(checksum)
            .Replace("-", string.Empty);
    }
}

定期计算校验和。


那是一个文件,他问的是一个目录。 - user1228
他的问题是:“如果我有一个文件,我想监视它是否有任何更改”,我读到的是“文件”,你在哪里看到目录? - Ta01

0

针对您所描述的具体应用程序,可以在目录中找到每个文件的SHA-1哈希值,然后将它们进行异或运算。

byte[] checksum = new byte[sha1Length];
for each file
   for (int index = 0; index < sha1Length; index++)
       checksum[index] ^= fileChecksum[index]

编辑后添加: 正如评论中指出的那样,这并不会真正起作用。一个特定的场景是添加两个相同的文件,它们在XOR中会互相抵消。 也许创建一个包含所有文件名、时间戳和文件哈希值的流,然后对其进行哈希处理,可以给你所需的结果。

再次编辑: 好吧,现在你改变了问题!那就算了吧!


如果安全是一个问题,那么异或并不是一个明智的选择(他没有说它是,但也许...)。相反,我建议对文件进行排序并散列哈希值。 - Kevin Montrose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接