元々はとあるページで、ユーザーが画像をアップロードし、そのページ上でユーザーが自身でアップロードした画像を利用するという要件でプログラムを書いていた時に、
「ユーザーが付けたファイル名をそのまま上げるのは嫌だけど、毎回timestampで個別のファイル名を付けていたらファイル数膨大になるしなー」
って思ったのがきっかけ。
なら画像のバイナリのハッシュ値をファイル名にすれば、同じ画像ファイルなら同じファイル名を生成できるじゃん、と。
$img_dir = "/var/www/foo/images/"; // 画像を格納するディレクトリ
// tmpファイルのパスを取得
$tmppath = $_FILES["upload"]["tmp_name"];
// ファイルの拡張子を取得
$path_parts = pathinfo($_FILES["upload"]["name"]);
$extension = $path_parts['extension'];
// 画像のデータをSHA-1でハッシュ化してファイル名を作る
$imgfilehash = hash_file("sha1", $tmppath);
// 画像格納先のフルパスを生成
$imgfilepath = $img_dir.$imgfilehash.".".$extension;
// tmpから画像を格納
move_uploaded_file($tmppath, $imgfilepath);
もちろんMD5で変換する以上、偶然違う画像でも同じハッシュ値が出る可能性は0じゃないけど、無視できる確率ではないかと。(15/05/30 コメントでの指摘を元に一部コード修正。またMD5だと衝突する可能性があるそうなので、より安全なSHA-1を採用しました。)
PHPで書いたけど、他の言語でも同じ手法で使えそう。