为大批量的文件检查文件散列值[英] checking file hashes for large batches of files

问题描述

我正在开发一种软​​件,该软件需要根据哈希列表检查大量文件,以查看自列表生成后是否有任何文件发生更改.我目前正在使用以下内容:


Public Shared Function md5(ByVal data As Stream) As String

Dim encryptor As New System.Security.Cryptography.MD5CryptoServiceProvider()

Dim ByteHash() As Byte = encryptor.ComputeHash(data)

Return Convert.ToBase64String(ByteHash)
End Function


我生成哈希的代码如下所示:

Dim myfile as new System.IO.FileStream(filename)
dim hash as string = md5(myfile)


哪个工作得很好,只是它很慢.许多文件都在 2GB 范围内,每个文件需要 20 秒或更长时间.我知道这很快,但我很好奇是否有类似 API 调用之类的东西,或者我可以做些什么来让它更快.我想如果有人知道那会是 The Code Project 的好人.

谢谢,

www.StudyX.com
www.PlazBackup.com

推荐答案

不用每次对文件进行哈希处理时都实例化一个新的MD5CryptoServiceProvider ,您将获得一个非常小的优势.

创建一个实例,然后多次调用它.例如;
私有 _hasher as  System.Security.MD5CryptoServiceProvider()公共 共享 功能 md5(ByVal 数据 As Stream) As 字符串返回 Convert.ToBase64String(_hasher.ComputeHash(data))End Function

问题来了要获取每个文件的哈希值,您必须再次完全读取每个文件,以查看文件是否更改.您已经以最快的速度完成了它.

相反,对于数据库中还没有的每个文件,从文件系统中获取 Last Modified 日期时间,对文件进行哈希处理,然后将其存储在数据库中.然后,在后续通过时,将新的 Last Modified 时间与存储在数据库中的时间核对.如果它们不同,则从文件中生成一个新的哈希值并与数据库中的哈希值进行比较.如果它们相同,则文件永远不会更改,只需更新数据库中的 Last Modified 数据.如果它们不同,请执行您需要的任何操作并保存新的哈希和上次修改的数据.

也许问题是您必须经常重新计算哈希?您可以使用 System.IO.FileSystemWatcher 来获取任何更改的通知.当文件被修改时,可以触发重新计算哈希.

您是否更改为使用"SHA"系列中的类似加密哈希函数?您可以使用 .NET 中提供的 SHA-256 函数,请参阅 http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx[^].

(顺便说一句,MD5 算法被认为是"损坏的",不用于任何安全目的,请参阅 http://en.wikipedia.org/wiki/MD5[^].关于"SHA"系列见 http://en.wikipedia.org/wiki/SHA-2[^].)


—SA

本文地址:https://www.itbaoku.cn/post/1394920.html