我正在寻找具有以下属性的特定哈希码。我不知道任何这样的哈希码,我不知道是否有可能做这样的事情。只是想把它放在那里,看看人们怎么说。
我有两个数据库(松散使用的术语 - 不要想到 SQL 或类似的东西),一个主数据库和一个备份数据库。需要保持两个数据库同步并检测数据库何时不同步。与其验证那里的每个数据,不如保留一些可以验证的哈希码。但是这两个数据库不一定共享所有修改。由于从 master 到 backup 的更改是批处理的,因此从 master 到 backup 的某些修改可能会被折叠。
即:假设数据库的当前状态具有元素 A->X、B->Y 和 C->Z。现在 B 被修改为 B->Y1,然后是 B->Y2。从主服务器发送到备份服务器的唯一更改是 B->Y2。中间的 B->Y1 被跳过。
现在,与其循环遍历每个数据库中的每个元素以验证它们是否匹配,我们更愿意在两个位置保留元素的运行哈希码,然后进行比较。哈希码必须计算如下:
假设 hm0 的前一个哈希码:
hashcode hm1 = f(hm0, A->X, B->Y, C->Z)
当 B 现在发生变化时:
hashcode hm2 = f(hm1, B->Y1)
然后
hashcode hm3 = f(hm2, B->Y2)
所以master会有h3的hashcode。现在备份将不会收到修改 B->Y2,所以如果它计算一个运行哈希码,它将是这样的:
哈希码 hb1 = f(hb0, A->X, B->Y, C->Z)
哈希码 hb2 = f(hb1, B->Y2)
现在我们希望 hb2 和 hm3 匹配,因为数据库的当前状态是相同的。但是大多数(如果不是全部)哈希码都不是这样工作的。
所以我们想要的是,我们首先要从哈希中“移除”B->Y 的贡献,然后“添加”B->Y1 的贡献,然后移除 B->Y1 的贡献并添加B->Y2 对哈希码的贡献。所以我们想要这样的东西:
两个函数 f, g:f 通过添加新元素的贡献来修改现有的哈希码,而 g 通过删除元素的贡献来修改现有的哈希码。
在主机上:
hm1 = f(hm0, A->X, B->Y, C->Z)
当 B 修改为 B->Y1 时:
hm2 = g(hm1, B->Y)
hm3 = f(hm2, B->Y1)
当 B 修改为 B->Y2 时:
hm4 = g(hm3, B->Y1)
hm5 = f(hm4, B->Y2)
hm5 是数据库当前状态的新哈希码 (A->X, B->Y2, C->Z)
备份时:
hb1 = f(hb0, A->X, B->Y, C->Z)
当 B 修改为 B->Y2 时:
hb2 = g(hb1, B->Y)
hb3 = f(hb2, B->Y2)
现在 hm5 和 hb3 应该匹配,因为两个数据库的当前状态是相同的。
那么:有没有这样的算法f和g?我希望我把问题说清楚了......谢谢。