Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mercurial全局变更集id的分配_Mercurial_Dvcs_Sha1_Changeset - Fatal编程技术网

mercurial全局变更集id的分配

mercurial全局变更集id的分配,mercurial,dvcs,sha1,changeset,Mercurial,Dvcs,Sha1,Changeset,显然,Mercurial为每个变更分配了一个全局变更集id。他们如何确保这是唯一的?Mercurial的变更集ID是每个变更集的“清单”的SHA-1哈希。它只打印全局ID的前十几个十六进制数字,但它使用完整的SHA-1进行内部操作。目前还不能保证它们是唯一的,但就实际目的而言,这是不太可能的 .正如Zach所说,变更集ID是使用。这是一个加密安全哈希函数的示例。加密哈希函数接受任意长度的输入字符串,并由此字符串生成固定长度的摘要。对于SHA-1,输出长度固定为160位,默认情况下,Mercuri

显然,Mercurial为每个变更分配了一个全局变更集id。他们如何确保这是唯一的?

Mercurial的变更集ID是每个变更集的“清单”的SHA-1哈希。它只打印全局ID的前十几个十六进制数字,但它使用完整的SHA-1进行内部操作。目前还不能保证它们是唯一的,但就实际目的而言,这是不太可能的


.

正如Zach所说,变更集ID是使用。这是一个加密安全哈希函数的示例。加密哈希函数接受任意长度的输入字符串,并由此字符串生成固定长度的摘要。对于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发生碰撞,因此这将是一个重大发现


更详细地说,在Mercurial中以递归方式使用SHA-1哈希函数。每个变更集散列通过连接以下内容计算:

  • 清单ID
  • 提交用户名
  • 提交日期
  • 受影响的文件
  • 提交消息
  • 第一父变更集ID
  • 第二父变更集ID
然后在所有这些上运行SHA-1(请参阅和)。因为哈希函数是递归使用的,所以变更集哈希将修复整个历史,直到变更集图中的根


这也意味着,如果添加行
helloworld,您将不会获得相同的变更集ID使用相同的提交消息同时发送到两个不同的项目——当它们的历史记录不同(不同的父变更集)时,两个新变更集将获得不同的ID。

有趣的是,还没有人在SHA-1哈希函数中发现冲突!