正如Zach所说,变更集ID是使用SHA-1散列函数计算的.这是加密安全散列函数的示例.加密散列函数接受任意长度的输入字符串,并从该字符串生成固定长度的摘要.在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 - 当它们的历史记录不同(不同的父变更集)时,这两个新变更集将获得不同的ID .