AFAIK git只相信sha1 hash是唯一的,所以当两个哈希值发生冲突时它不会处理(我知道,这不太可能)。
出于好奇,处理这样的冲突的好方法是什么?如果匹配,我正在考虑检查文件大小。
是否有人能够通过数学来确定我将减少多少冲突的机会?
或者我是否过度思考这一点并且SHA1在实践中已经足够好了?
答案 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个文件。
或者:你去街角商店购买一张,只需一张百万美元的彩票。星期六来,你发现你赢得了一百万美元!
哎呀,如果你能幸运的话,你应该买彩票。所以你去街角商店购买一张只有一张百万美元的彩票。星期三来,你发现你又赢了一百万美元!
哎呀,如果你能幸运的话,你应该买彩票。所以你去街角商店购买一张只有一张百万美元的彩票。星期六来,你发现你又赢了一百万美元!
然而,无论你多么充满希望,无论多么多的梦想,你都有可能在任何一种场景中成为幸运者,这就是你应该担心多少。