• ベストアンサー

2つの画像ファイルが異なるファイルだと判定したい

PHPを使って2つの画像ファイルが異なるファイルであることを判定するプログラムを考えています。以下のように、画像ファイルを文字列として扱い、md5ハッシュ値を取得し、それを比較することで、画像ファイルが違うということを判別しています。 こちらですが、もし他に良いロジックをご存知の方がいらっしゃいましたら、ご意見いただければと思います。 よろしくお願いいたします。 <?php $hash1 = getMD5('hoge1.jpg'); $hash2 = getMD5('hoge2.jpg'); if ($hash1 == $hash2) { echo "同じ画像ファイルです。"; } else { echo "同じ画像ファイルではありません。"; } // 画像ファイルを文字列として扱い、 // md5ハッシュ値を取得する関数 function getMD5($image) { $fp = fopen($image, 'r'); $str = ''; while(!feof($fp)) { # 画像ファイルを1行ずつ読み込んで、文字列にする $str .= fgets($fp); } fclose($fp); // $strのmd5ハッシュ値を得る return md5($str); } ?>

質問者が選んだベストアンサー

  • ベストアンサー
  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.5

抜けがあった。 (binary)file_get_contents($img1, FILE_BINARY) === (binary)file_get_contents($img2, FILE_BINARY)

tadao-o
質問者

お礼

ご回答ありがとうございます。実際にテストしてみたところ問題なく画像の判別ができました。こちら、是非参考にさせていただきたいと思います。

その他の回答 (4)

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.4

この場合 == でも、=== でもどちらでもいい。 習慣的に === を使うのはいいことだと思いますが。 そんなものより、FALSE が返ってきてるかどうかを[厳密に]調べる必要があるのでは? > 画像ファイルを文字列として扱い 暗号化は単なる比較目的で使用するものではない。 (binary)file_get_contents($img1) === (binary)file_get_contents($img2) ファイルの差分が必要な場合は xdiff

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

質問の回答にはなっていませんので、ご了承ください。 ちょっとした、ゴミプロ作ってみました。 別の関数使っても結果が同じになるという例です。 あ、そうそう、そういえば、#2さんがやっているように、 文字列の比較は「===」か「strcmp()」使うのが、いいらしいです。 strcmp()を使うのが鉄則。みたいな言い方をしている人もいますが、ホントのとこは俺は知りません。 文字列の比較に「==」を使うと 動作がキモいらしいです。まぁ、ケースバイケースだと思いますが。 http://d.hatena.ne.jp/hnw/20080606 「strcmp()」も 場合によって 良くないらしいです。 http://d.hatena.ne.jp/hnw/20090123 =========================================================== <html> <head> <meta http-equiv=content-type content=text/html; charset=utf-8> </head> <body> <? $me = $_SERVER[PHP_SELF]; $ImageFile = "icon.gif"; $Str = file_get_contents($ImageFile); //--------------------------------------------------------- $md01 = md5($Str); $md02 = md5_file($ImageFile); print "$md01<br>$md02<hr>"; //--------------------------------------------------------- $len01 = filesize($ImageFile); $len02 = strlen($Str); print "$len01<br>$len02<hr>"; //--------------------------------------------------------- ?> </body> </html> ===========================================================

tadao-o
質問者

お礼

ご回答ありがとうございます。わかりやすいサンプルプログラムを準備していただき助かります。参考にさせていただきます。

回答No.2

md5_file() こちらの関数でハッシュ値を比較してみてはいかがでしょうか。 <?php if(md5_file('hoge1.jpg') === md5_file('hoge2.jpg')){   echo "同じ画像ファイルです。"; }else{   echo "同じ画像ファイルではありません。"; } ?>

参考URL:
http://php.net/manual/ja/function.md5-file.php
tadao-o
質問者

お礼

ご回答ありがとうございます。md5_fileという関数があるのは知りませんでした。参考にさせていただきます。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

とりあえず、そちらの書いたソースの $fp = fopen($image, 'r'); $str = ''; while(!feof($fp)) { # 画像ファイルを1行ずつ読み込んで、文字列にする $str .= fgets($fp); } fclose($fp); は、よほど PHPのバージョンが古くない限りは、 $str = file_get_contents($image); 一行で済みます。 どの程度の精度を求めているのか分からないので、かなりテキトーです。 大雑把に filesize() で分けてしまうとか、 GD が入ってる必要がありますが、imagecreatefromjpeg() とかして、imagesx() , imagesy() で 画像の縦横の大きさを比べるとか、 そんな程度しか思いつきません。 できるかどうかは分かりませんが、ハッシュを使わずに、そのまま文字列として比較するっていう乱暴な方法もあるかもしれません。

tadao-o
質問者

お礼

ご回答ありがとうございます。確かにfile_get_contentsは便利ですね。是非、使いたいと思います。