我们有一个非常旧的、不受支持的程序,可以跨 SMB 共享复制文件。它有一个校验和算法来确定文件内容在复制之前是否已更改。该算法似乎很容易被愚弄——我们刚刚找到了一个示例,其中两个文件完全相同,除了单个“1”更改为“2”之外,返回相同的校验和。算法如下:
unsigned long GetFileCheckSum(CString PathFilename)
{
FILE* File;
unsigned long CheckSum = 0;
unsigned long Data = 0;
unsigned long Count = 0;
if ((File = fopen(PathFilename, "rb")) != NULL)
{
while (fread(&Data, 1, sizeof(unsigned long), File) != FALSE)
{
CheckSum ^= Data + ++Count;
Data = 0;
}
fclose(File);
}
return CheckSum;
}
我不是一个程序员(我是一个系统管理员),但我知道基于异或的校验和将是相当粗糙的。对于两个大小相同但内容不同的文件,该算法返回相同校验和的机会有多大? (我并不期望得到确切的答案,“远程”或“很可能”就可以了。)
如何在不影响性能的情况下对其进行改进?
最后,到底发生了什么fread()
?我快速浏览了文档,但无法弄清楚。是Data
依次设置为文件的每个字节?Edit:好的,所以它正在将文件读入unsigned long
(我们假设这里是 32 位操作系统)块。每个块包含什么?如果文件的内容是abcd
, 的值是多少Data
在第一遍?是吗(Perl 语言):
(ord('a') << 24) & (ord('b') << 16) & (ord('c') << 8) & ord('d')
MD5 http://en.wikipedia.org/wiki/MD5通常用于验证传输文件的完整性。 C++ 源代码很容易获得。它被广泛认为是一种快速且准确的算法。
也可以看看稳健且快速的校验和算法? https://stackoverflow.com/questions/122982/robust-and-fast-checksum-algorithm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)