Algorithm 是否有一种校验和算法也支持;减去;它的数据?

Algorithm 是否有一种校验和算法也支持;减去;它的数据?,algorithm,hash,checksum,crc,Algorithm,Hash,Checksum,Crc,我有一个大约有1亿个文档的系统,我想在镜像之间跟踪它们的修改。为了有效地交换有关修改的信息,我希望按天发送有关修改文档的信息,而不是按每个单独的文档发送。大概是这样的: [ 2012/03/26, cs26], [ 2012/03/25, cs25], [ 2012/03/24, cs24], ... 其中,每个cs是在特定日期创建的所有文档的时间戳校验和 现在,我遇到的问题是,我不知道有什么算法可以在删除文档时从校验和中“减去”数据。由于明显的原因,没有一种加密哈希适合这种需要,我也找不到任

我有一个大约有1亿个文档的系统,我想在镜像之间跟踪它们的修改。为了有效地交换有关修改的信息,我希望按天发送有关修改文档的信息,而不是按每个单独的文档发送。大概是这样的:

[ 2012/03/26, cs26],
[ 2012/03/25, cs25],
[ 2012/03/24, cs24],
...
其中,每个cs是在特定日期创建的所有文档的时间戳校验和

现在,我遇到的问题是,我不知道有什么算法可以在删除文档时从校验和中“减去”数据。由于明显的原因,没有一种加密哈希适合这种需要,我也找不到任何CRC算法可以做到这一点

我考虑的一个选项是让deletes向散列中添加额外的信息,但这会导致更多的问题,因为节点可以以不同的顺序接收delete请求,并且当节点重新启动时,它会重新读取文档中的所有时间戳,因此有关删除的信息将丢失

我也不希望在内存中使用所有文档哈希的哈希树,因为这将使用大约8 Gig的内存,我认为这对于这种需要来说有点过分了

目前,最好的选择似乎是在后台完全不时地重新生成这些散列,但这也会带来很多不必要的开销,而且不会立即提供有关更改的信息

那么,你们知道一种校验和算法,它可以让我从校验和中“删除”一些数据吗?我需要算法稍微快一点,并且校验和能够强烈地指示最小的更改(这就是为什么我不能真正使用普通XOR)

或者你对整个设计有更好的想法?

怎么样

hash = X(documents, 0, function(document) { ... })
其中X是聚合XOR(下面是javascript-y伪代码):

f()是单个文档信息的散列?(无论是时间戳、文件名、ID还是其他)


使用XOR可以“减去”文档,但在每个文档的基础上使用散列可以保持检测小更改的散列质量。

我不明白。为什么不能对所有的校验和进行异或运算呢。如果一个文档被删除,您可以对该文档的校验和进行异或运算,并且您应该对其余的文件进行校验和运算。您每天有多少次修改?你就不能为修改做一个校验和吗?@aioobe我真的没有为特定的文档保留单独的校验和,所以我没有想到,但是是的,这是一个好主意,基本上Jason建议了同样的事情。不清楚你想用这些校验和做什么。假设一个节点接收到
[2012/03/26,cs26]
。。。现在怎么办?@biziclop修改可以以不同的顺序到达每个节点,因此在这种情况下,节点可能实际上是同步的,但它们会有不同的想法。好主意,这么简单!
function X(documents, x, f)
{
   for each (var document in documents)
   {
      x ^= f(document);
   }
   return x;
}