显然 Mercurial 为每个更改分配了一个全局更改集 ID。他们如何确保这是独一无二的?
最佳答案
正如 Zach 所说,变更集 ID 是使用 SHA-1 hash function 计算的。这是加密安全散列函数的示例。加密散列函数采用任意长度的输入字符串,并从该字符串生成固定长度的摘要。在 SHA-1 的情况下,输出长度固定为 160 位,其中 Mercurial 默认只显示前 48 位(12 位十六进制数字)。
加密散列函数具有以下特性:很难找到产生相同输出的两个不同输入,即很难找到满足 x != y
的字符串 H(x) == H(y)
。这称为抗碰撞性。
由于 Mercurial 使用 SHA-1 函数来计算变更集 ID,因此对于相同的输入(相同的变更、相同的提交者名称和日期),您将获得相同的变更集 ID。但是,如果您使用不同的输入( x != y
),则会由于碰撞阻力而获得不同的输出(变更集 ID)。
换句话说,如果您没有为不同的输入获得不同的变更集 ID,那么您就发现了 SHA-1 的冲突!到目前为止,还没有人发现 SHA-1 的冲突,因此这将是一个重大发现。
更详细地说,SHA-1 哈希函数在 Mercurial 中以递归方式使用。每个变更集哈希是通过连接计算的:
然后在所有这些上运行 SHA-1(参见 changelog.py 和 revlog.py )。因为散列函数是递归使用的,所以变更集散列会将整个历史一直修复到变更集图中的根。
这也意味着,如果您将
Hello World!
行同时添加到两个不同的项目并使用相同的提交消息,则不会获得相同的变更集 ID——当它们的历史不同(不同的父变更集)时,两个新的变更集将变得不同身份证件。关于mercurial - mercurial 全局变更集 ID 的分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3562161/