为什么写入文件会改变内容的哈希值?

3

我注意到,在使用vim将一些哈希复制粘贴到文件中后,哈希值不如预期。即使是打开并写出文件时也是一样的情况。使用nano也有相同的行为,所以肯定有什么我遗漏了。

$ echo -n  "foo" | openssl dgst -sha256
2c26...e7ae
$ echo -n "foo" > hash.txt
$ openssl dgst -sha256 hash.txt
SHA256(hash.txt)= 2c26...e7ae

但是,当我使用nano或vim打开hash.txt并在不插入任何内容的情况下退出时,我随后会得到以下哈希值:b5bb...944c

我还注意到,如果没有打开文件并写出,我在使用cathead命令时看不到输出。编码是否已更改?


1
不知何故,您在文件中插入了一个换行符。无论如何,我无法重现您的结果。 - President James K. Polk
1
echo foo | openssl dgst -sha256 => b5bb…4944c。这是带有换行符的相同的 foo - phd
1个回答

4

大多数文本编辑器,包括Vim在内,退出时会在文件末尾添加一个新行。这是因为根据POSIX的规定,文本文件要么为空,要么以换行符结尾,所以大多数用户期望和希望这种行为。

正如您已经注意到的那样,在末尾添加一个新行会改变哈希值,而您得到的哈希与序列foo\n一致,其中\n是一个新行符。

如果您使用的是足够新的Vim,则可以通过设置nofixeol来控制上述行为,它将保留最后一行的现有换行符或缺少换行符。


我相信如果没有nofixeol,那么noeol只能在binary中使用。 - bk2204

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