更改文件名会影响文件的MD5哈希值吗?

103

改变文件名会影响文件的MD5哈希值吗?

7个回答

229

不是的,哈希值仅针对文件内容。您可以在md5sum的源代码其MD5实现中看到这一点。如果您可以访问md5sum,您也可以进行测试:

$ echo "some arbitrary content" > file1
$ cp file1 file2
$ md5sum file1
f0007cbddd79de02179de7de12bec4e6  file1
$ md5sum file2
f0007cbddd79de02179de7de12bec4e6  file2
$

20
这应该是答案。问题被标记为“md5sum”。 - ingyhere
3
感谢直截了当的回答。 - Edward J Beckett
太好了!我没有Linux来尝试那个。但是我有Stackoverflow :) - Faizan
你不需要使用Linux来了解这个。你可以在MacOSX或Windows上产生相同的结果。 - Alex
1
如果有人在寻找Windows的等效替代,就像@alexandreMulatinho提到的那样:用fciv替换md5sum,用copy替换cp,它们的功能是一样的。如果您进入Linux的Windows子系统,则md5sum哈希值与fciv哈希值匹配。 - Jake Stevens-Haas

35

一般来说,“文件的MD5哈希值”是基于文件内容计算出来的。名称可以随意更改。

$hash1 = md5(file);
// change file name
$hash2 = md5(file);

这两个哈希码将是相同的。

在某些(相当专业的)用例中,文件元数据(名称、时间戳等)是用于计算哈希的数据的一部分。然后

$hash1 = md5(file);
// change file name
$hash2 = md5(file);

会产生两个不同的哈希值。


23
这个问题是在询问关于CLI工具“md5sum”,而不是算法本身。 - jameshfisher

6
在Linux中使用EXT文件系统,由于文件名不是存储在文件本身中,而是存储在文件所在的目录项(dentry)中,文件的i节点(inode)然后映射到名称。在Linux中更改文件名不会影响其md5sum。对于Windows,我不能确定。

3
Windows文件系统不会在文件中存储文件名。对于“md5sum”的简单移植应该能够表现得符合预期。 - MauganRa

0
如果哈希是从文件内容计算出来的,那么它就不应该。

5
这个问题是在询问有关 CLI 工具“md5sum”的内容,而不是有关该算法的一般性问题。 - jameshfisher

0
在ESXi(确切地说是ESXi 5.5)上,相同内容但文件名不同的md5sum是不同的。这让我相信VMFS-5文件结构也包括文件名。如果我们不关心文件名,有没有办法仅检查文件内容的md5sum?我找不到任何选项。有什么建议吗?

你在谈论哪些文件?虚拟磁盘映像(.vmdk)吗?在vmdk头文件中,有一些数据可能取决于文件名和位置。你是如何在测试中重命名这些文件的?--- 从文件内容的角度来看,除此之外,VMFS是一个普通的文件系统,文件的内容并不直接取决于它们的名称。 - pabouk - Ukraine stay strong

-1
作为对https://dev59.com/FW445IYBdhLWcg3wE2Ne#14360831评论的回应:
这仅适用于一个文件是另一个文件的副本的情况,但当生成具有完全相同内容的两个不同名称的文件时,它将无效。 我已经尝试过这个:
nancy@nancy:~/Documents$ md5sum /home/nancy/Documents/1test.pdf
c5a445b7186dfb220ea79d2001acf3f1  /home/nancy/Documents/1test.pdf
nancy@nancy:~/Documents$ md5sum /home/nancy/Documents/2test.pdf
cefa063abf0c0a9e80b2b75e70100836  /home/nancy/Documents/2test.pdf

文件1test.pdf和2test.pdf均使用gimp软件创建。相同的内容以两个不同的名称导出。


1
这意味着文件内容并不完全相同...程序必须在每个文件中导出不同的元数据。 - Milney

-2

1. md5是基于文件的二进制内容计算的。 2. 文件名、最后修改时间等元数据不会影响md5。我已经通过以下步骤进行了测试,让我们来看看“最后修改”元数据: i) 我创建了一个名为“a.txt”的文件,并添加了一些内容并创建了哈希值,假设哈希值为“xyz”。 ii) 然后我只是在文件中添加了一个空格,再次计算哈希值,假设它返回了“abc”。 iii) 我只是在步骤(ii)中撤消了我的更改,再次计算哈希值,我得到了初始哈希值(“xyz”)

这表明,即使文件的元数据发生了变化,只要文件内容保持不变,哈希值仍然相同。

希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接