哈希算法实现

3
我需要一个哈希函数来检查一些文件版本(基本上是检查客户端文件是否与服务器端文件相同)。我的问题是在.net库中有半打的HashAlgorithm实现,而我有点迷失了。我正在寻找一种快速算法,输出长度相对较短。安全性在这里并不是很重要。谢谢!
4个回答

4

由于这不是安全问题,MD5可能适合您的目的。它在文件内容哈希方面非常标准。


在我的测试中,.NET对MD5和SHA1的实现速度仅相差几个百分点,因此两者都可以。SHA1提供了更少的碰撞机会,即使安全性不是问题,这也可能是一个关注点。 - Roman Starkov
MD5具有与GUID(128位)相同的大小优势,因此您可以将MD5存储到DB-GUID(uniqueidentifier)列中。 - springy76

2

从上面的所有内容来看,MD5是最简单和最快速的。

顺便说一句,对于你描述的问题,你不需要使用加密哈希函数,任何哈希函数都可以。因此,你可以使用校验和,例如CRC32(或更快的Adler32)。


我同意CRC32等算法通常比MD5/SHA1等更快。如果OP非常关注性能并且不介意使用非本地实现,那么他应该选择这条路。 - Chris Haas
1
我有点担心32位密钥可能会碰撞... 1/2^32 的概率相当低,但如果出现碰撞将是一场灾难。 - Nicolas Repiquet
事实上,CRC32在这里不是一个好的选择。它用于检查传输错误,而不是区分大量的文件。 - Nick Johnson
@Nicolas:这是一个权衡。更快的计算速度意味着更低的可靠性。无论如何,你说它是用来比较文件不同版本的,而不是唯一标识几百万个文件。因此,碰撞概率仍然非常低。 - vartec
@vartec:比较两个不同版本的文件并唯一识别几百万个文件,当通过比较它们的 CRC、哈希或任何东西(除了文件本身)来比较文件时,这是相同的事情。正如您所说,这是一个权衡,而MD5看起来是一个令人满意的中间点(其中满意意味着“我不会在我的有生之年看到碰撞”)。 - Nicolas Repiquet
显示剩余2条评论

1
为了提高性能,请进行测量。所有哈希函数都是“快速”的——对于某种速度概念而言。在您列出的这些函数中,MD5是最快的,但这并不意味着其他函数不够“快”。在32位VM上,最慢的应该是SHA-512,但它仍然可以在普通PC上每秒处理大约30兆字节的数据,这也不算太慢。如果使用64位VM,SHA-512会得到很大的提升,而SHA-256将成为最慢的函数。

如果有疑问,使用SHA-256。只有在实际实验中证明哈希速度是应用程序的瓶颈,并且可以证明您确实没有使用密码破解的哈希函数存在安全问题时,才考虑其他选项。这是正确的顺序,因为评估性能比评估安全性要容易得多,因此首先选择良好的安全性更加安全。除了选择MD5作为更快的函数之外,您还可以想象导入受控MD4实现(有一个链接):MD4甚至比MD5更容易被破解,但也更快。或者您可以尝试一些本地代码(在哈希函数实现上,本地代码通常比托管代码快2到4倍)。

如果需要较短的输出,可以简单地截断。这会机械地降低安全性,因此只有在您使用哈希函数与安全无关时才应该这样做。


稍微详细解释一下我的使用方法,我会在给定的时间间隔内向服务器请求一个文件名和哈希值的列表,并将其与本地文件进行比较。如果两个哈希值不同,我会下载并替换过时的文件。除非用户喜欢让应用程序崩溃,否则没有理由伪造文件。 - Nicolas Repiquet

0

MD5算法虽然快速,但现在强烈不建议使用。

人们倾向于对安全性放松警惕(“我不太关心安全”-我也这样做过,我们都会),但如果您确实不需要任何安全保障,那么可以选择MD5。

否则,请查看SHA算法。SHA-1被广泛使用。我不是加密专家,但我认为其他算法具有更长的块大小,可能会慢一些。有关差异的一些阅读材料可以在以下链接中找到:http://en.wikipedia.org/wiki/SHA-1以及此链接所链接的页面。

请注意,仅用于比较目的(例如检查文件是否相同且未被篡改)的缩短哈希值的有效方法是从哈希值中取出一部分字符。只需确保每次从相同的索引处取出它们(例如字符0-5;或字符5、11和13,您明白了吧)。


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