如何处理重复哈希

时间:2014-10-10 21:23:41

标签: git hash storage

AFAIK git只相信sha1 hash是唯一的,所以当两个哈希值发生冲突时它不会处理(我知道,这不太可能)。

出于好奇,处理这样的冲突的好方法是什么?如果匹配,我正在考虑检查文件大小。

是否有人能够通过数学来确定我将减少多少冲突的机会?

或者我是否过度思考这一点并且SHA1在实践中已经足够好了?

3 个答案:

答案 0 :(得分:3)

SHA1在实践中已经足够好了。在略微乐观的假设下,两个不同物体之间发生碰撞的可能性大约是2 160 中的一个。由于"生日问题" the chance rises remarkably fast with more objects,但需要大量的提升才能获得被闪电击中的机会:about 1 out of 700,000 in any given year,或者你一生中3000分之一(同一环节)。 (是的,我知道这些数字似乎不能合作。我只是使用他们的数字。)

但是,最终,git应该切换到SHA的更高位数变体。这将破坏所有假设SHA-1总是正好为40个字符的脚本。 : - )

答案 1 :(得分:3)

在某些时候,我写了并计算了以下内容(不知道我的数学是否正确)

  

生日悖论 - 对于365桶,你有50%的碰撞几率   在23岁时,70%的可能性为99.9%,在100岁时为99.9999,但是你没有   达到36%直至366(闰年除外)。一个普通人可能会猜到你不会   在50%直到大约180.

     

对于160位的SHA地址空间,您有50%的可能性   添加1.42 * 10 ^ 24个对象时发生碰撞。 Git没有处理   碰撞,而是假设它们永远不会发生。

请注意,Git将4种不同类型的对象放入同一地址空间 - 提交,blob,树,标记。 Git已经检查了被散列的内容是否相同,因此检查文件大小并没有做任何事情。

有许多处理哈希冲突的技术。当哈希输出空间很小(如16位或更小)时,它们总是被使用。多哈哈算法或桶是我在实践中最常见的。

答案 2 :(得分:1)

  

有没有人能够做一些数学来确定多少   我会减少冲突的机会吗?

     

或者我是否过度思考这一点并且SHA1在实践中已经足够好了?

你过度思考它。如果没有解释它发生的可能性有多大,那就无法解释为什么,而且可能性很大......我们甚至不会夸大它的可能性。

在这里,试试这个:在五张牌的情况下,获得皇家同花顺的几率是649739中的1。

所以,你正在玩五张牌,而桌上有人得到皇家同花顺。

接下来,他又获得了皇家同花顺。

接下来,他又获得了皇家同花顺。

接下来,他又获得了皇家同花顺。

然后他必须连续四次用石头剪刀击败你。


这是另一个。假设Linux内核项目每秒生成一百万个文件。如果它已经这样做,那么每一秒,自从大爆炸以来,它仍然缺少达到50-50赔率所需的2 ^ 80个文件。


或者:你去街角商店购买一张,只需一张百万美元的彩票。星期六来,你发现你赢得了一百万美元!

哎呀,如果你能幸运的话,你应该买彩票。所以你去街角商店购买一张只有一张百万美元的彩票。星期三来,你发现你又赢了一百万美元!

哎呀,如果你能幸运的话,你应该买彩票。所以你去街角商店购买一张只有一张百万美元的彩票。星期六来,你发现你又赢了一百万美元!


然而,无论你多么充满希望,无论多么多的梦想,你都有可能在任何一种场景中成为幸运者,这就是你应该担心多少。