ヤマグチです。
順番が回ってきたので、「気になったことを調べてみる」第二弾です。
今回はファイルのハッシュ値について、お話しできればなと思います。
というのも、パソコンの Windows11 をクリーンインストールする機会がありまして、 ディスクイメージ(iso ファイル)からインストール用 USB を作る時の公式のハッシュ値とダウンロードした iso ファイルのハッシュ値が同じか確認する工程があったので、調べてみた感じです。
そして、毎度のことながら説明部分は AIに丸投げします。
ファイルのハッシュ値とは
以下 copilot からの返答
簡単に言うと、ハッシュ値は「ファイルの指紋」です。
とのこと。
要するに、ファイルの内容から計算される、決まった長さの文字列が同じかどうかでファイルの中身が改ざんされていないかのチェックに使うということらしいです。
ちなみに、 Microsoft さんのファイルのハッシュ値の確認には
というコマンドを使うように書いてありました。
以下 copilot に要約してもらった内容
Get-FileHash とは
Get-FileHash は、ファイルのハッシュ値を計算する PowerShell コマンドです。既定では SHA256 アルゴリズムを使用します。
ハッシュ値とは
- ファイルの内容に対応する一意の値
- ファイル名や拡張子ではなく、「中身」から計算される
- ファイル名を変更してもハッシュ値は変わらない
- ファイルの内容を1文字でも変更するとハッシュ値は変わる
という特徴があります。
主な用途は次の2つです。
- ファイルが改ざん・破損していないか確認する
- 2つのファイルが完全に同じ内容か確認する
とのこと。
検証してみる
テキストファイルの検証
説明によると、ファイルの中身が同じであればハッシュ値は同じになり、ファイル名を変更しても同じであるとのこと。
そこで、用意したのがこんな感じ。

utf8.txt | 「あ」という一文字だけ入ったテキストファイル |
utf8_bom.txt | 「あ」という一文字だけ入ったテキストファイルを BOM 付きで保存 |
空データ君.txt | ファイル名通りの空ファイル |
空データ君のコピー.txt | ファイル名通りの空ファイルのコピー |
これのハッシュ値を Get-FileHash を使って調べてみると

予想通り
空データのファイルは、ファイル名が異なっていても同じハッシュ値になった
utf8 の BOM 付きで保存したものは、異なるハッシュ値になった
さて、iso ファイルについても同じ感じで調べてみたいけど検証用のデータを作るのが手間なので、同じような検証が出来そうな圧縮ファイルでやってみる。
圧縮ファイルの検証
圧縮ファイルには、いくつかのファイルやフォルダーなど、いろんなものが入っている。
その中身からハッシュ値が作られるということは、中身のファイル名やフォルダ名が変わってもハッシュ値が変わったりするはず。
さっきのテキストファイルが入ったフォルダーを圧縮をしてみる
.png)
作った圧縮ファイルは3つで、圧縮方法のみが異なります。
これらのハッシュ値を確認すると

ハッシュ値が違う・・・。こんな時は Copilot に聞いてみよう。
以下 copilot からの返答
簡単に言うと、圧縮ファイルは「中身」だけでなく、「どう圧縮したか」の情報もファイルに保存されるからです。
例えば同じ A.txt を ZIP にしても、
- 圧縮レベル:標準
- 圧縮レベル:最大
- 作成日時
- 圧縮ソフト(7-Zip、Windows標準など)
が違うと、できあがる ZIP ファイルのバイト列が変わることがあります。
とのこと。
それならばと、コピーと圧縮の組合せを試してみる

「テスト2」フォルダーは、「テスト1」フォルダーのコピーしたもの
「テスト3」フォルダーは、「テスト1」フォルダーをコピーして、中にあるファイルの内「utf8.txt」を「Utf8.txt」と頭文字を大文字に変換したもの。
これらの圧縮ファイルのハッシュ値を見てみると
※ テスト2フォルダー

※ テスト3フォルダー

ハッシュ値が同じにならないですね。作成日が違うと異なる場合があると copilot も言ってたのでその関係かもしれない。それか圧縮元のフォルダ名が違うからかもしれない。
これは同じハッシュ値の圧縮ファイルは作れないのでは?
そうなると、Get-FileHash の説明にもあるようにハッシュ値が公式と同じだと改変などがされていないという検証にはなりそう。
そんなこんなで
まだまだ圧縮ファイルの検証とかをしてみたいですが、調べすぎると時間が無くなるのでこの辺にしておこうかと思います。
そういえば、ハッシュ値が安全な理由とかは特に書いてないですが、インターネット上でもAIでも調べればたくさん出てくるので、興味がある人は調べてみてもいいかもしれないですね。
とはいっても、使う機会があまりないかもしれませんが!
おまけ
今回のハッシュ値の検証には SHA256 を利用しました。
作られるハッシュ値は 2 の 256 乗で、およそ 10 の 77 乗ぐらいになるらしいです。
1兆が 10 の 12 乗
1京が 10 の 16 乗
ということで、もはや何通りなのか分からないほど巨大になるみたい。
