防止哈希链中的无限循环?
Prevent infinite loops in hash chains?
好的,所以我想实现一个简单的网络算法,其中每个参与者选择其对等方并轮流查看他们的最新哈希值,从而产生自己的哈希值链,如下所示:
H[n+1] = hash( H[n] + P[n][k] )
其中 P[n][k]
是所选节点的最新哈希值。我们称之为 "timestamping".
这样做的目的是生成一个网络,通过生成从 A
到B
。网络以无需许可的方式执行此操作 - 这意味着如果任何参与者为您的事件添加时间戳A
,那么最终他们都会这样做。
我面临的问题是,if participant X2
timestamps X1
, X3
timestamps X2
等等,如果X[n]
真的是peer X1
这可能会自行加倍,并且即使没有真正提交新事件,它们也会循环地为自己加上时间戳。
当我将我的更改从 fork B
合并回 A
时,git 或 mercurial 也会发生同样的问题,生成一个新的散列,然后合并头部(提示) A
变成 B
,依此类推。换句话说,工作副本中没有任何变化,但每次新合并都会产生一个新的哈希值,从而导致虚假更改。
Mercurial 通过返回上次检查任何东西来防止它 "really changed"。意思是,如果自上次在分支上提交以来没有文件更改,它基本上会说 "merging with direct ancestor has no effect".
我同样可以通过遍历整个哈希链直到找到循环来防止循环。但这可能是一个非常长的遍历。如果我将它切断,比如说,10 个哈希,那么 11 个或更多参与者的循环仍然会导致哈希循环,即使实际上没有 "changed"。或者我可能对 "really changed".
有一些概念
有什么办法可以解决这个问题,或者 google 的一些条款吗?
您可能需要比散列更多的元数据来确定它是否已经来自某个节点。可以想象,此元数据可能是散列数据的一部分(除了 "timestamp" 之外)。这样就可以确认元数据的真实性。例如,在 git 的情况下,哈希值不仅是父提交哈希值的哈希值,而且是提交消息、author/committer 信息、日期和树哈希值的哈希值。
关于要搜索的术语:通常此类系统(git、Mercurial、比特币、各种文件系统等)使用Merkle Trees 来实现交易验证和完整性检查。
好的,所以我想实现一个简单的网络算法,其中每个参与者选择其对等方并轮流查看他们的最新哈希值,从而产生自己的哈希值链,如下所示:
H[n+1] = hash( H[n] + P[n][k] )
其中 P[n][k]
是所选节点的最新哈希值。我们称之为 "timestamping".
这样做的目的是生成一个网络,通过生成从 A
到B
。网络以无需许可的方式执行此操作 - 这意味着如果任何参与者为您的事件添加时间戳A
,那么最终他们都会这样做。
我面临的问题是,if participant X2
timestamps X1
, X3
timestamps X2
等等,如果X[n]
真的是peer X1
这可能会自行加倍,并且即使没有真正提交新事件,它们也会循环地为自己加上时间戳。
当我将我的更改从 fork B
合并回 A
时,git 或 mercurial 也会发生同样的问题,生成一个新的散列,然后合并头部(提示) A
变成 B
,依此类推。换句话说,工作副本中没有任何变化,但每次新合并都会产生一个新的哈希值,从而导致虚假更改。
Mercurial 通过返回上次检查任何东西来防止它 "really changed"。意思是,如果自上次在分支上提交以来没有文件更改,它基本上会说 "merging with direct ancestor has no effect".
我同样可以通过遍历整个哈希链直到找到循环来防止循环。但这可能是一个非常长的遍历。如果我将它切断,比如说,10 个哈希,那么 11 个或更多参与者的循环仍然会导致哈希循环,即使实际上没有 "changed"。或者我可能对 "really changed".
有一些概念有什么办法可以解决这个问题,或者 google 的一些条款吗?
您可能需要比散列更多的元数据来确定它是否已经来自某个节点。可以想象,此元数据可能是散列数据的一部分(除了 "timestamp" 之外)。这样就可以确认元数据的真实性。例如,在 git 的情况下,哈希值不仅是父提交哈希值的哈希值,而且是提交消息、author/committer 信息、日期和树哈希值的哈希值。
关于要搜索的术语:通常此类系统(git、Mercurial、比特币、各种文件系统等)使用Merkle Trees 来实现交易验证和完整性检查。