选择哈希函数

时间:2012-08-10 12:57:19

标签: hash

我想知道:在保持哈希函数的预期冲突计数的同时,可以安全地进行散列的最大字节数是多少?

对于md5,sha- *,甚至可能是crc32或adler32。

2 个答案:

答案 0 :(得分:3)

你的问题不明确。 “最大字节数”是指“最大项目数”?被散列的文件的大小与冲突的数量无关(假设所有文件当然都不同)。

“保持预期的碰撞次数”是什么意思?从字面上看,答案是“无限的”,但在一定数量之后,你将会像预期的那样发生碰撞。

至于问题的答案“我可以在保持x%下的碰撞概率的情况下散列多少项?”,请看下表:

http://en.wikipedia.org/wiki/Birthday_problem#Probability_table

从链接:

  

为了比较,10 ^ -18到10 ^ -15是典型硬盘的不可纠正的误码率[2]。理论上,MD5,128位应该保持在该范围内,直到大约820亿个文档,即使其可能的输出更多。

这假定散列函数输出均匀分布。你可以假设,给定足够的项目进行散列和加密散列函数(如md5和sha)或良好的散列(如Murmur3,Jenkins,City和Spooky Hash)。

并且还假设没有恶意对手积极制造碰撞。那么你真的需要一个安全的加密哈希函数,比如SHA-2。

请注意:CRC和Adler是校验和,旨在检测数据损坏,而不是最小化预期的冲突。它们具有如下特性:“检测大小为 Y的所有位归零,输入高达Z千字节”,但不是很好的统计特性。

编辑:不要忘记这完全是关于概率的。完全可以只散列两个小于0.5kb的文件并获得相同的SHA-512,尽管它极不可能(例如no collision has ever been found for SHA hashes till this date)。

答案 1 :(得分:-2)

你基本上看着生日悖论,只看真正的大数字。 鉴于数据的正常“分布”,我认为在遇到问题之前你可能会占到大约5-10%的可能性,但没有任何保证。

只需使用足够长的哈希就不会遇到问题;)