【要約】ファイルのmtimeを「未変更の証拠」にしてはいけない——SHA-256で入力データの不変性をテストする [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
データ解析パイプラインの構築者が、入力データの不変性を確認するためにファイルの更新時刻(mtime)を利用する際、誤判定を招くリスクがある。mtimeはメタデータであり、内容そのものの同一性を保証しないためである。具体的には以下の問題が発生する。
- ・内容が変わらずに、メタデータである更新時刻だけが更新される。
- ・内容が変更されても、os.utime等を用いて更新時刻を偽装できる。
- ・ファイルシステムによって、時刻の精度や見え方が異なる。
// Approach
開発者がデータの整合性を確実に保証するため、SHA-256を用いたハッシュ値による検証手法を導入する。単なる比較に留まらず、テストの診断性を高める構造を提案している。
- ・hashlibを用い、1 MiBずつのチャンク読み込みでメモリ効率を確保する。
- ・pytestでサイズ、mtime、ハッシュを保持するFileSnapshotクラスを実装する。
- ・assertを分離し、「内容の変更」と「メタデータの変更」を区別して検知する。
- ・ディレクトリ単位では、相対パスとハッシュを含むmanifestを作成して管理する。
// Result
解析処理の前後で入力データのバイト列が同一であることを、厳密かつ効率的に検証できる。これにより、不具合発生時の原因特定が容易になる。
- ・「データの破壊」と「メタデータの更新」を切り分け、デバッグを迅速化する。
- ・巨大なデータセットに対し、I/Oコストを考慮した検証手法の使い分けが可能になる。
- ・実行記録として、パス、サイズ、ハッシュのセットを保存し、監査性を向上させる。
Senior Engineer Insight
> 実戦では、I/Oコストと検証精度のトレードオフが重要だ。巨大なデータセットに対し、全件のSHA-256計算は非効率になり得る。キャッシュ確認にはmtimeを用い、厳密な検証時のみハッシュを使うといった使い分けが不可欠だ。また、ハッシュは「バイト列の一致」を示すものであり、「意味の一致」を保証しない点に注意せよ。CSVの書式変更などで不一致が起きるため、検証対象の定義を明確にする必要がある。