gpt4 book ai didi

c++ - 这个校验和算法可以改进吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:56 27 4
gpt4 key购买 nike

我们有一个非常古老的、不受支持的程序,它可以跨 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;
}

我不是一名程序员(我是一名系统管理员),但我知道基于 XOR 的校验和会非常粗糙。对于大小相同但内容不同的两个文件,此算法返回相同校验和的可能性有多大? (我不期待一个确切的答案,“远程”或“很可能”都可以。)

如何在不对性能造成巨大影响的情况下进行改进?

最后,fread() 发生了什么?我快速浏览了文档,但无法弄清楚。 Data 是否依次设置为文件的每个字节? 编辑:好的,所以它正在将文件读入unsigned long(假设这里是32 位操作系统) block 。每个 block 包含什么?如果文件的内容是abcd,那么第一遍Data的值是多少?是吗(在 Perl 中):

(ord('a') << 24) & (ord('b') << 16) & (ord('c') << 8) & ord('d')

最佳答案

MD5通常用于验证传输文件的完整性。源代码很容易在 C++ 中获得。它被广泛认为是一种快速准确的算法。

另见 Robust and fast checksum algorithm?

关于c++ - 这个校验和算法可以改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1045183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com