Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 相同文件内容的md5sum是否不同?_C_Linux_Md5sum - Fatal编程技术网

C 相同文件内容的md5sum是否不同?

C 相同文件内容的md5sum是否不同?,c,linux,md5sum,C,Linux,Md5sum,我在计算md5sum时遇到了一个问题。我有一个恢复工具,它可以归档文件的元数据(inode),还可以计算文件的md5sum,并在安装期间将它们存储在sqlite数据库中。当文件被删除/删除时。该工具使用sqlite-db中的元数据恢复删除的文件。它恢复文件。现在,我想确保恢复的文件与原始文件完全相同。因此,重新计算恢复的文件md5sum,如下所示。问题是,奇怪的是,对于少数文件,我可以看到(使用cat)文件内容完全相同(与删除之前一样)&stat命令显示相同的输出(除了不同的inode编号),但

我在计算md5sum时遇到了一个问题。我有一个恢复工具,它可以归档文件的元数据(inode),还可以计算文件的md5sum,并在安装期间将它们存储在sqlite数据库中。当文件被删除/删除时。该工具使用sqlite-db中的元数据恢复删除的文件。它恢复文件。现在,我想确保恢复的文件与原始文件完全相同。因此,重新计算恢复的文件md5sum,如下所示。问题是,奇怪的是,对于少数文件,我可以看到(使用cat)文件内容完全相同(与删除之前一样)&stat命令显示相同的输出(除了不同的inode编号),但md5sum不同

以下两个文件具有相同的内容-因此具有不同的索引节点号不会影响md5sum

764efa883dda1e11db47671c4a3bbd9e  /test/hi1.txt
764efa883dda1e11db47671c4a3bbd9e  /test/hi.txt
有什么想法吗,我该怎么做

char file_location[512] = {0};

char md5_cmd[512], md5sum[34];
FILE *pf;
//some recovery stuff goes here...

//Recompute md5  of recovered file
memset(md5_cmd, '\0', 512);
sprintf(md5_cmd, "md5sum %s", file_location);

pf = popen(md5_cmd, "r");
if (!pf) {
    fprintf(stderr,"Could not open pipe");
    return;
}

// get data
fgets(md5sum, 34, pf);

if (pclose(pf) != 0)
fprintf(stderr, "Error: close Failed.");

fprintf(stdout, "Md5sum is %s", md5sum);

您无法可靠地将文件内容与
cat
进行比较。这样(除非您使用
cat-A
或诸如此类),可能会有许多未被注意到的差异:空格与制表符、行尾空白等

您应该将文件与

diff -u fileA fileB


.

,我可以看到(使用cat)
如果有你看不见的东西怎么办?控制字符、空格与制表符、一个文件末尾的换行符?对文件进行hex转储并比较hex。为什么具有完全相同内容的文件具有相同的MD5?或者只是不同的编码。MD5适用于二进制表示。@不,谢谢。这是个好建议。我先试试。@Jonas,不,问题是有时内容完全相同的文件有不同的md5sum。@谢谢,Vladislav,我将阅读更多关于它的实际表示的内容。另一个(非常令人不快的)选项是,系统内存不稳定,md5sum进程有时会命中损坏的内存位置,导致“已验证”数据在计算和时摆动。这些事情发生了!md5sum在相同的输入数据上发生变化有/没有/很好的理由。它的目的不是改变。反之亦然,两个不同的文件可能确实具有相同的md5sum。这就是所谓的散列冲突,虽然不太可能,但却是可能的,这是散列函数的一个自然属性。谢谢大家,使用hextump和diff确实表明文件确实不同,它们(内容)和我想的不一样。
cmp fileA fileB