假设您有一个现有哈希g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa
,它是从原始字符串dont downvote my stupid question
现在我给这个哈希加时间戳(在JS /伪代码中):
var hash = 'g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa';
var today= new Date(); // 2017-10-19
var timestamped = hash + today;
var new_hash = SHA256(timestamped);
// new_hash is 34t346tf3847tr8qrot3r8q248rtbrq4brtqti4t
如果我想验证原始字符串,我可以这样做:
var verified = goodHash('dont downvote my stupid question',hash); // true
如果我想验证我可以执行的带时间戳的版本:
var original_hash = 'g84t5tw73y487tb38wo4bq8o34q384o7nfw3q434hqa';
var today = '2017-10-19';
var verified = goodHash(original_hash+today, timestamped_hash); // true
但是,如果我尝试在时间戳上验证原始字符串,我可以这样做:
var today = '2017-10-19';
var verified = goodHash('dont downvote my stupid question'+today, timestamped_hash); // FALSE
现在假设对n
次迭代一遍又一遍地对这个原始字符串进行哈希和时间戳。
如果我有n-1th
哈希,我只能验证n-1th
时间戳。
但如果我有原始字符串dont downvote my stupid question
并想要验证任何ith
时间戳,0 < i < n
,该怎么办?
基本上,我想验证一个只有我应该知道的字符串是否已经用给定日期加上时间戳,而不管它有多少次加上时间戳和而不增加长度字符串(太多 - 虽然任何长度的增加会随着n
增长而接近无穷大)。
这甚至可能吗?哈希甚至可以包含所有这些信息吗?
答案 0 :(得分:0)
让我们来看看这里涉及的数学:
首先,您有一个输入字符串s
和一个时间戳序列t
。我将使用t[i]
来表示ith
时间戳。您的重复散列是一种递归关系:
f(i) = hash(f(t[i-1]) + t[i])
其中+
表示字符串连接。现在我们要确定是否存在一个封闭的公式F(x)
,它将计算ith
哈希,其时间复杂度低于评估递归关系f(i)
。
实现此目的的一种方法是查找与x(i)
具有相同哈希的字符串f(t[i-1]) + t[i]
。对于良好的散列算法,这些碰撞非常罕见。我的直觉是找到这样一个字符串(f(t[i-1]) + t[i]
本身除外)比直接从递归关系计算更困难。