Dev Study
← 解説「ハッシュ化 — 同じ内容なら必ず同じ40文字になる」に戻る

サンプルコードで身につける: ハッシュ化 — 同じ内容なら必ず同じ40文字になる

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

1自分でSHA-1を計算してみる

まずは「同じ入力なら必ず同じ出力」を自分の手で確かめます。実行するとハッシュが出ます。文字列を書き換えて何度でも試してください。1文字変えるだけで出力が全く別物になることが体感できます。

Python

2入力の長さが変わっても出力は40文字のまま

1バイトでも100万バイトでも、出てくるのは同じ40桁です。だからGitは「巨大なファイルの同一性を40文字の比較で判定する」ことができます。実行して桁数が変わらないことを確かめてください。

Python

3改ざんが必ず露見する仕組み

保存時のハッシュを控えておき、取り出すときに再計算して突き合わせます。中身を書き換えるとハッシュが変わるため、名札と中身の不一致は隠せません。Gitが履歴の完全性を保証できる根拠がこれです。

Python

4手元のgitで確かめる

実際のGitにも同じ性質があります。同じ内容を2回渡すと同じ値が返り、1文字変えると全く別の値になります。ターミナルにそのまま貼って試せます(リポジトリの外でも動きます)。

# --stdin で標準入力の内容をそのままハッシュ化する
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a

# 何回やっても同じ
$ printf 'hello\n' | git hash-object --stdin
ce013625030ba8dba906f756967f9e9ca394464a

# 「!」を1文字足しただけ
$ printf 'hello!\n' | git hash-object --stdin
4effa19f4f75f846c3229b9dbdbad14eff362f32

# 先頭を大文字にしただけ
$ printf 'Hello\n' | git hash-object --stdin
e965047ad7c57865823c7d992b1d046ea66edf78

5なぜ「一方通行」だと嬉しいのか

ハッシュから元の中身を逆算することはできません。総当たりするしかない、という感覚をつかむサンプルです。4桁の数字なら1万通りで見つかりますが、桁数が増えると現実的な時間では終わらなくなります。

Python