【要約】Unicode正規化でファイル名が衝突する問題を、実データ537,689件で調べた [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が異なるOS間でファイルを共有する際、Unicodeの扱いの差によりファイル名が衝突するリスクに直面する。
- ・MacからWindowsへの移行時に発生するとされる「濁点分解」によるファイル名の破損。
- ・Linux系(区別あり)とWindows/macOS(区別なし)の混在による大文字小文字の衝突。
- ・Unicode正規化(NFC)により、見た目が同一の異なるコードポイント(CJK互換漢字)が同じ名前として扱われる問題。
// Approach
筆者は、実データに基づいた正確な衝突確率を算出するため、大規模なファイル名走査を実施した。
- ・OSSリポジトリ10本とnpmパッケージ891本、計537,689件の名前を母集団として抽出。
- ・展開による名前の変化を防ぐため、tarballやgit cloneの状態から直接名前を読み取った。
- ・「名前の数」と「パッケージ単位」の2つの観点で、衝突の発生率を算出。
- ・NTFSの大文字変換規則($UpCase)とUnicodeの変換規則を実機で比較検証した。
// Result
調査の結果、当初想定した濁点分解の衝突は0件であり、衝突は特定の条件下で発生することが判明した。
- ・ファイル名単位の衝突率は0.014%(75組)であった。
- ・衝突は大規模なリポジトリに集中しており、名前が2,000件未満の単位では衝突は0件だった。
- ・内訳は、Linuxカーネルでの大文字小文字の衝突(13組)と、CJK互換漢字による正規化衝突(62組)であった。
- ・NTFSの変換規則はUnicode標準と一部異なるが、見逃しは発生しない特性を持つ。
Senior Engineer Insight
> ファイル名衝突は「稀だが、大規模なリポジトリで確実に発生する」問題である。単なる「名前の数」ではなく、管理単位(パッケージ数)でのリスク評価が重要だ。また、NTFSの挙動がUnicode標準と完全には一致しない点は、クロスプラットフォームなツール開発において、見逃しを防ぐために「過剰検知」を許容する設計が不可欠であることを示唆している。