我有一个大约有1亿个文档的系统,我想跟踪它们在镜像之间的修改。为了有效地交换有关修改的信息,我希望按天而不是每个单独的文档发送有关修改文档的信息。像这样:
[ 2012/03/26, cs26],
[ 2012/03/25, cs25],
[ 2012/03/24, cs24],
...
其中每个 cs 是特定日期创建的所有文档的时间戳的校验和。
现在,我遇到的问题是我不知道在删除文档时可以从校验和中“减去”数据的算法。由于显而易见的原因,没有一个加密哈希值符合需要,而且我找不到任何能够做到这一点的CRC算法。
我考虑过的一个选项是删除会向哈希添加额外信息,但这会导致更多问题,因为节点可以按不同顺序接收删除请求,并且当节点重新启动时会重新读取所有来自文档的时间戳,因此有关删除的信息将丢失。
我也不喜欢在内存中使用带有所有文档哈希的哈希树,因为这会使用大约8 GB的内存,而且我认为这对于这种需求来说有点过分。
目前最好的选择似乎是在后台完全不时地重新生成这些哈希值,但这也是很多不必要的开销,并且不会立即提供有关更改的信息。
那么,你们知道校验和算法会让我从校验和中“删除”一些数据吗?我需要算法有点快,校验和强烈表明最小的变化(这就是我不能真正使用普通XOR的原因)。
或者你对整个设计有更好的想法?
答案 0 :(得分:5)
怎么样
hash = X(documents, 0, function(document) { ... })
其中X是聚合XOR(跟随javascript-y伪代码):
function X(documents, x, f)
{
for each (var document in documents)
{
x ^= f(document);
}
return x;
}
和f()是单个文档信息的哈希值? (无论是时间戳,文件名或ID还是其他)
使用XOR可以让你“减去”文档,但是在每个文档的基础上使用哈希可以保持检测小变化的散列质量。