【问题标题】:Is there a case when two git commit ids are identical (in two different projects)?是否存在两个 git commit id 相同的情况(在两个不同的项目中)?
【发布时间】:2015-09-28 20:02:37
【问题描述】:

我正在开发一个新版本的 git-stats 工具,用于根据 Git 提交、作者等制作一些图表。

在当前版本中,它接受相同的提交 ID,为项目名称命名:

{
   "some-project-url" { "hash1": "date", ... }
   "some-project-url-fork" { "hash1": "date", ..., "commit-in-fork-id": "date" }
}

我想删除存储项目 url 的要求,这意味着没有相同的哈希值。

现在我在考虑这是否是一个好的举措。

当导入多个项目,每个commit存储一次时,有两个相同id的概率是多少?

其实,在现实生活中,什么时候会碰巧有两个相同的id(在两个不同的项目中)?

【问题讨论】:

  • 与 SHA-1 冲突的问题相同,因为 git 哈希是使用 SHA-1 创建的
  • 由于 Git 提交 ID 是 SHA-1 哈希,因此您实际上是在寻找 SHA-1 哈希冲突。这些当然是可能的(它们在数学上是有保证的:P),但到目前为止,使用 SHA-1 很难找到冲突。在正常的 GIt 项目中,您不太可能遇到冲突。以 Linux 项目为例,这是迄今为止最大的 Git 项目,哈希值非常独特,它们仍然可以仅使用前几个字符来引用提交,因此没有真正的冲突,不。
  • 阅读this one
  • @poke true,您可以参考缩写的 SHA1,但随着时间的推移,它已经演变:stackoverflow.com/a/21015031/6309
  • @Joost 啊,确实!真的,真的,真的!

标签: git


【解决方案1】:

SHA-1 哈希由 160 位组成,允许 2^160 = 1.4615e+48 组合。生日悖论使得它只需要大约这个数字的根(大约 2^80)就可以获得 50% 的碰撞机会,但这仍然是巨大的。但是请注意,散列的输入并不是完全随机的,因为它只是提交数据的散列(参见here)。

我认为最可能的冲突原因不是 SHA1,而是输入数据中的完全匹配。鉴于作者的详细信息和时间戳也在其中,这似乎不太可能。

总而言之,使用提交哈希来识别提交似乎足以在不同的项目中使用而没有任何真正的麻烦风险。

【讨论】:

    【解决方案2】:

    需要考虑三种情况。

    1. 碰巧具有相同提交 ID 的两个不同的非恶意提交。
    2. 故意构造两个不同的提交以具有相同的提交 ID
    3. 两个项目包含相同的提交。

    情况 1 极不可能。

    既然已经构建了 sha1 碰撞技术,那么情况 2 是可能的,但 github 至少已经采取了对策来尝试阻止此类提交。

    情况 3 实际上是最有可能的。许多项目是其他项目的分支。

    【讨论】:

    • Case 3 并不是真正的事情,因为如果它们是一个 fork,它就是同一个提交。我想知道的是:我们有案例 2 的示例吗?如何构建两个不同的项目,它们至少包含一个相同的提交哈希(提交 id 冲突),但元数据不同(作者/消息/更改等),并且仍然是有效的 repos?谢谢!
    猜你喜欢
    • 2019-12-12
    • 2012-04-29
    • 2023-04-05
    • 1970-01-01
    • 2023-03-03
    • 2021-02-13
    • 1970-01-01
    • 2014-12-06
    • 2019-07-30
    相关资源
    最近更新 更多