更快的MD5替代方案?我正在开发一个在整个驱动器中搜索给定文件的程序。目前,我计算已知文件的MD5哈希值,然后递归扫描所有文件以查找匹配项。唯一的问题是MD5在处理大文件时非常慢。有没有我可以使用的更快的替代方案,同时保留很少的误报机会?所有代码都在C#中。谢谢。更新我读过即使MD5可以非常快,磁盘I/O应该是限制因素。这让我相信我的代码可能不是最优的。这种方法有问题吗?MD5md5=MD5.Create();StringBuildersb=newStringBuilder();尝试{使用(FileStreamfs=File.Open(fileName,FileMode.Open,FileAccess.Read)){foreach(bytebinmd5.ComputeHash(fs))sb.Append(b.ToString("X2"));}返回sb.ToString();}赶上(异常){返回“”;如果文件大小匹配,我希望你只检查MD5匹配。另一个优化是对前1K(或其他一些任意但相当小的数字)进行快速校验,并确保它在处理整个文件之前匹配。当然,这一切都假设您只是在寻找特定文件的匹配/不匹配决策。无论加密要求如何,都存在哈希冲突的可能性,因此不能使用哈希函数来保证两个文件相同。我曾经写过一次类似的代码,我首先通过索引所有文件并丢弃任何大小不同的文件来快速运行它。然后对剩余的条目执行快速哈希比较(在每个文件的部分)(比较此步骤的字节已被证明不太有用-许多文件类型在文件开头有一个具有相同字节的公共标头)。然后使用MD5检查此阶段之后留下的任何文件,如果MD5匹配,则在最后对整个文件进行字节比较以确保内容相同。首先考虑你的瓶颈是什么:散列函数本身还是磁盘访问速度?如果您受限于磁盘,则更改散列算法不会给您带来太多好处。根据您的描述,我暗示您总是在扫描整个磁盘以查找匹配项-考虑先构建索引,然后仅将指定的哈希值与索引匹配,这样会更快。只是线性读取文件?读取整个文件,计算md5哈希,然后比较哈希似乎没有意义。按顺序读取文件,一次几个字节,允许您在读取后丢弃文件的绝大部分,比如4个字节。并且您将节省计算哈希函数的所有处理开销,这在您的情况下不会提供任何东西。如果您已经拥有驱动器上所有文件的哈希值,那么比较它们是有意义的,但是如果您必须即时计算它们,那么哈希值似乎没有任何优势。我在这里错过了什么吗?在这种情况下,哈希能给你带来什么?使用MD5比较文件有一个小问题:已知成对的文件不同但具有相同的MD5。这意味着您可以使用MD5来判断文件是否不同(如果MD5不同,则文件必须不同),但是您不能使用MD5来判断文件是否相等(如果文件相同,则MD5必须相同,但如果MD5相等,则文件可能相等,也可能不相等。您应该使用未被破坏的哈希函数(如SHA-1),或(如@SoapBox所述)只需使用MD5作为快速查找候选对象以进行更深入比较的方法。参考资料:UsingMD5CryptoServiceProviderandBufferedStream以上是C#学习教程:FasterMD5alternative?所有分享的内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——using(FileStreamstream=File.OpenRead(filePath)){using(varbufferedStream=newBufferedStream(stream,1024*32)){varsha=newMD5CryptoServiceProvider();byte[]校验和=sha.ComputeHash(bufferedStream);返回BitConverter.ToString(校验和).Replace("-",String.Empty);}}本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
