ハッシュ関数とは?解説
ハッシュ関数は任意のサイズの入力を固定サイズの値にマッピングし、同じ入力に対して毎回同じ出力を決定論的に生成します。
ハッシュ関数は一方向のフィンガープリント生成マシンです。任意のデータを与えると、そのデータを一意に表す短い固定サイズの値を返します。同じ入力は常に同じハッシュを生みますが、逆に動かして入力を復元することはできません。ハッシュ関数はチェックサム、キャッシュ、署名、そして CI の整合性の仕組みの大部分の下支えになっています。
ハッシュ関数とは何か
ハッシュ関数は任意のサイズの入力を受け取り、ダイジェストと呼ばれる固定サイズの出力を生成します。決定論的であるため、同一の入力は常に同じダイジェストにマッピングされます。良いハッシュは出力を均等に分散させるため、入力のわずか 1 バイトの変更でもまったく異なるダイジェストを生成します。
暗号学的ハッシュの性質
暗号学的ハッシュ関数は保証を追加します。一方向であり(ダイジェストから入力を導出できない)、衝突耐性があり(同じダイジェストを持つ 2 つの入力を見つけられない)、雪崩効果を持ちます(入力の小さな変更が出力を完全にかき混ぜる)。これらの性質がセキュリティ用途に安全である理由です。
ハッシュ化と暗号化
ハッシュ化は暗号化ではありません。暗号化は鍵で可逆であり、ハッシュ化は意図的に一方向で鍵を持ちません。ハッシュ化はフィンガープリントを取って検証するために行うものであり、後で復元するつもりのデータを隠すためではありません。両者を混同すると、ハッシュを「復号」しようとするような誤りにつながり、それは設計上不可能です。
CI におけるハッシュ関数
CI はハッシュをキャッシュキー(依存関係が変わったときにキャッシュが無効になるよう lockfile をハッシュする)、コンテンツアドレッシング(artifact やイメージをそのハッシュで識別する)、整合性検証(ダウンロードのハッシュを既知の値と比較する)に使います。これらはパイプラインをより速く、より信頼できるものにします。
# Hash inputs to build a precise cache key
steps:
- uses: actions/cache@v4
with:
path: .cache
key: build-${{ hashFiles('**/*.lock') }}Latchkey に関する注記
Latchkey のキャッシュはコンテンツアドレッシングです。キャッシュエントリはその入力をハッシュすることでキーイングおよび検証されるため、キャッシュヒットは入力が本当に一致することを意味します。キャッシュされたビルドを正しく保つのと同じハッシュ関数の原則です。
重要なポイント
- ハッシュ関数は任意の入力を固定サイズのダイジェストに決定論的にマッピングします。
- 暗号学的ハッシュは一方向で衝突耐性があり雪崩効果を持つため、セキュリティに安全です。
- CI はハッシュをキャッシュキー、コンテンツアドレッシング、整合性検証に使います。