Dev Study
← Gitの内部構造から理解する コース

1. ハッシュ化 — 同じ内容なら必ず同じ40文字になる

Gitのすべての仕組みは、たった1つの性質の上に建っています。「中身を入れると、40文字の文字列が出てくる。同じ中身なら必ず同じ文字列になり、1文字でも違えば全く別の文字列になる」という性質です。

① ハッシュ関数は「中身 → 固定長の要約」の一方通行

SHA-1に文字列を入れたときの出力
"hello"入力(5バイト)
"hello!"入力(6バイト)
SHA-1(どんな長さの入力でも40桁の16進が出る)
aaf4c61d…hello のハッシュ
8f7d88e9…hello! のハッシュ
  • ・出力は常に40桁の16進数(160ビット)。入力が1バイトでも1GBでも変わらない
  • ・「!」を1文字足しただけで、出力には元の面影が全く残らない
  • ・逆向き(ハッシュ → 元の中身)を計算で求めることはできない

重要なのは2点です。同じ入力からは必ず同じ出力が出ること。そして、少しでも違う入力からは全く違う出力が出ることです。

② この性質があると「中身の名札」として使える

ハッシュ値を識別子として使う
Aさんのファイル中身: hello
Bさんのファイル中身: hello
それぞれハッシュを計算すると
aaf4c61d…完全に一致
だから
「中身が同じか」を40文字の比較だけで判定できるファイル全体を突き合わせる必要がない
  • ・1GBのファイル同士でも、比較するのは40文字だけで済む
  • ・逆に、ハッシュが違えば中身は確実にどこかが違う

Gitはこの性質を使い、「名前」ではなく「中身」でデータを管理します。次のレッスンで、その具体的な形を見ます。

③ 改ざんが必ず露見する

後からこっそり中身を書き換えると何が起きるか
保存時中身 hello / 名札 aaf4c61d
誰かが中身だけ書き換える
中身 hacked名札は aaf4c61d のまま
取り出すときに再計算すると
ハッシュが一致しない → 破損として検出名札と中身の不一致は隠せない
  • ・Gitはオブジェクトを読むたびにハッシュを検算できる
  • ・これがGitが「履歴の完全性」を保証できる根拠になっている

中身から名札を計算しているので、中身を変えれば名札も変わってしまいます。だから静かな改ざんができません。

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗