我需要在以下情况下检查数据完整性:数据以不同大小的块写入存储(对于每个块,我们知道它在最终文件中的偏移量)。但是,块以任意顺序和多线程出现。它们以完全不同的顺序从存储中读回(并且块具有不同的大小)。
我目前的想法如下:
#define MODEST_PRIME 1021
unsigned char checkbuf[MODEST_PRIME];
void check_function(unsigned char *chunk, size_t offset, size_t length, unsigned char *result)
{
size_t i;
for(i=0; i<length; i++)
result[(i+offset)%MODEST_PRIME]^=chunk[i];
}
这似乎提供了防止任何单个字节和(在某种程度上)更改的保护 交换块(交换块之间的距离不太可能被大素数整除)。不同块的此函数的结果可以只是一起进行,因此它是完全可并行化的。
但是,与md5 sum或任何其他现代哈希函数相比,此函数看起来非常不可靠。但据我所知,md5 sum或sha-1 sum的计算不能以任意顺序进行。
嗯,问题是,我们有没有更好的解决方案
答案 0 :(得分:0)
难道你不能只计算每个块的连接偏移量,长度和内容的SHA1总和,然后再将它们xor计算在一起吗?
答案 1 :(得分:0)
一个选项是树状的检查层次结构。
使用两个级别,您可以将块放在树的第一(底部)级别。树的第二级是通过连接较低级别的校验和而创建的字节数组。
这适用于任何哈希函数。