私が知っている限り、ファイルの小さな部分でも変更するとチェックサム全体の結果が変わりますが、ファイル名を変更するとチェックサムには影響しません(SHA-1、SHA-256、MD5を試しました)。
なぜ?ファイル名がファイルデータの一部ではありませんか?ファイルシステムによって異なりますか?
答え1
ファイル名はディレクトリエントリの文字列であり、他の多くのメタデータ(ファイルタイプ、権限、所有権、タイムスタンプなど)がinodeに保存されます。したがって、ファイル名は、ファイルを構成する実際のデータの一部ではありません。実際、単一のファイルには、ファイルシステム内の任意の数の名前(ハードリンク)を持つことができ、任意の名前の付いた複数のシンボリックリンクを介してアクセスすることもできます。
md5
ファイル名はファイルデータの一部ではないため、md5sum
または同様のユーティリティを使用してMD5チェックサムを計算すると自動的には含まれません。
したがって、ファイル名(または所有権、タイムスタンプ、権限など)を変更したり、他の名前またはシンボリックリンク(存在する場合)のいずれかを介してファイルにアクセスしても、ファイルのMD5チェックサムには影響しません。
答え2
はい、あなたが言ったように、「ファイル名はファイルデータの一部ではありません」
ファイル名を保存できません存在する文書。その場合、ファイルは変更されます。ただし、ファイル名、その他のメタデータ、ファイルデータをチェックサムすることは有効ですが、一般的に悪い考えです。
ファイル名は含まれているディレクトリの一部です。ファイルの一部ではありません。
チェックサム/ハッシュをすべて実行するには、次のように動作します。
(おそらく良い考えではないでしょう)
echo "$filename" | xargs -n1 -I{} bash -c 'echo "$1"; cat "$1"' x {} | shasum
答え3
ファイル名を変更してもチェックサムには影響しません(SHA-1、SHA-256、MD5を試してみました)。
まあ、それは少し間違った接続です。 SHA-1、SHA-256、およびMD5はファイルまたはファイル名をハッシュせずに、代わりにビットストリームをハッシュします。したがって、あなたが得た結果は、あなたが提供することを選択した入力に依存し、それを表示しません。
これで、実際にハッシュするデータに指定されたファイルの内容のみを含む、およびsha1sum
ユーティリティsha256sum
を使用した可能性があります。md5sum
ファイル名または権限ビット、所有者情報、タイムスタンプ、またはその他のメタデータではありません。
しかしそれは真実ではありません持つそう。以下は、2つのファイルのSHA-256ハッシュとその名前です。
$ echo hello > a.txt; cp a.txt b.txt
$ ./checksum.sh a.txt b.txt
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca -
bad46702033923726add35ef8d97570f1aa40d93dad1d6ba63e7b051a34b9efc -
スクリプトは単にファイル名をハッシュされたデータの前に追加します。他のアプリケーションは、ファイルの内容とともに、ハッシュ入力にメタデータを含めることも、データの一部のみを含むハッシュを含めることもできます。
明らかに、ファイル名を含めると、同じファイルでも異なる名前で参照される可能性があるため、ハッシュが異なるという欠点があります。
/tmp/test$ ./checksum.sh a.txt ./a.txt /tmp/test/a.txt
aed49f7730ca0736fe1a021375d1ca9b509a4e72910b422578df8b4b1930aeca -
85ec58226886f4f853212b2d21bb2fb72447813ac13a59e9376b2e0c02074839 -
25c1c072481131e07c3fc20d16109472872233f658f4df3c4982fb195a048b96 -
タイムスタンプ、所有者などを方程式に追加すると、ファイルを別のシステムにコピーしてハッシュが変わり、ハッシュの使いやすさが非常に疑わしくなります。ファイル名も欠落または変更される可能性があります。
ハッシュにメタデータを含める場合は、最も簡単な方法は、tarをアーカイブまたは便利であると思われるメタデータを格納する別のコンテナにファイルを置き、ハッシュしてコピーすることです。アーカイブからファイル(コンテンツ)を抽出した後、ファイルシステムのメタデータは異なる場合がありますが、ファイルが提供されているアーカイブを引き続き確認できます。
上記のスクリプトは次のとおりです。
$ cat checksum.sh
#!/bin/bash
for f in "$@"; do
(printf "%s\0" "$f" ; cat "$f") | sha256sum -
done
答え4
あなたが言ったように、今両方の答えが強調されています。ファイル名はデータの一部ではなく、ファイルのデータ(別名メタデータ)です。
これは実際に便利です。これにより、名前が異なる場合でも重複項目を検出できるためです。fdupes
重複項目の検索などのプログラムは、jdupes
実際にプロセスを高速化するためにチェックサムを使用します(チェックサムはいわゆる不変です)。