by 唐草 [2021/06/02]
ぼくはコンピュータ関連の学問を修めていないので、どうしても人間的な発想のアルゴリズムを作ってしまう。以前こんなことを書いた。
今のコンピュータは十分に速い。だからコンピュータにとって無駄の多いプログラムを動かしても、ボトルネックが隠れていることが表面化することは滅多に無い。超精度のコンピュータ的発想が求められるのは、制約の多い組み込み機器か数万人が同時アクセスするような高負荷環境といった極端な場面ぐらいだろう。どちらもぼくには縁のない世界だ。
コンピュータ的な考え方と言っても様々なものがある。このブログに適応するのであれば、毎日アップしている画像ファイルの命名規則が分かりやすい例になりそうだ。
プログラム経験がなくても、アップロードした画像ファイルをそのままの名前で保存したら意図せぬ上書きが発生してしまいそうなことは予想できるだろう。別ファイルによる上書きを避けるために重複のないファイル名に改める必要がある。
人間的な発想しかできないぼくは、アップされた画像ファイル名を記事IDに置き換えることを選んだ。これなら記事と対になるので重複はありえない。スマートな考え方に思えるが、実は賢いやり方ではない。
ぼくは同じ画像を何度も使いまわしている。まったく同じ画像なのにアップロードするたびに新しい名前で保存される。つまり、このサーバには同じ画像ファイルが別名で何枚も保存されている。ここの画像は小さいので1,000枚あっても大したことはないが、無駄なことには変わりない。
では、異なる画像では名前の重複が起こらないようにしつつ、同じ画像には同一の名前を与えるにはどうしたら良いのか?これこそコンピュータ的な発想がなければ解決できない問題だ。
正解の1つは、ファイルハッシュ(中身の要約値)をファイル名にする方法。これなら同じファイルには常に同じ名前が付くし、1bitでも異なれば全く別の名前になる。重複の可能性はほぼゼロ。
こういう発想がスラスラできるようになりたい。とは言え、これは知っていれば一瞬で終わること。だから勉強って大切なんだよね。