每次进行提交时,git / hg都会生成一个SHA,以便在存储库的历史记录中唯一标识该提交。
假设我想合并两个存储库(我们没有哪些存储库的信息)。 这就提出了一个问题:如果有人想要对同一个合并的repo进行特定的提交,那么是否会有一个重复的SHA哈希会在获得该注释时混淆git?如果不是这样,git会做什么?
最后,我想问题也是:整个世界的每个存储库都有重复的哈希?
答案 0 :(得分:5)
整个世界的每个存储库都有重复的哈希值吗?
可能是的,但极不可能。让我引用这个Git book,其中包含一个非常具有说明性的例子:
很多人在某种程度上担心,他们会通过随机事件在他们的存储库中有两个对象,它们散列到相同的SHA-1值。那么呢?
如果您碰巧提交的哈希值与存储库中的上一个对象具有相同的SHA-1值,Git将会在Git数据库中看到上一个对象,并假设它已经被写入。如果您尝试在某个时刻再次检出该对象,您将始终获得第一个对象的数据。
[...]
这是一个示例,让您了解如何获得SHA-1冲突。如果地球上所有65亿人都在进行编程,并且每一秒,每个人都生成的代码相当于整个Linux内核历史(360万Git对象)并将其推入一个巨大的Git存储库,则需要大约2年时间直到该存储库包含足够的对象才能使单个SHA-1对象发生碰撞的概率为50%。 你的编程团队的每个成员都会在同一天晚上被无关紧要的事件中的狼群攻击并杀死。
简而言之:是的,SHA1碰撞在理论上是可行的,但在天文学上不太可能Git根本不考虑这种情况。
答案 1 :(得分:0)
最后,我想问题也是:整个世界的每个存储库都有重复的哈希?
不太可能。到目前为止,还没有人发现SHA1碰撞。虽然可能存在重复的哈希值,但这些重复的哈希值将识别具有相同内容的完全相同的对象。
另见:
How would Git handle a SHA-1 collision on a blob? 和 Probability of SHA1 collisions