そのため下記のようなコードを書いたのですが、これがサーバーにとってどのくらいの負荷になるか想像ができずに、やっていいものか躊躇しています。
-----
$a = file_get_contents('a.bin');
$b = file_get_contents('b.bin');
if ($a==$b) {
print "同じデータ";
} else {
print "違うデータ";
}
-----
比較対象のa.binとb.binは10kくらいのデータサイズが想定されています。
このコードは単純な文字列比較と同じように負荷など気にせず気軽に書いていいコードなものでしょうか。アドバイスいただけますと幸いです。
よろしくお願いいたします
実行される回数や、そのコードがのっかてるページ全体の処理にもよると思うんです。
Cherenkov さんから、ハッシュが提案されてますけど、ハッシュ値を求めるには、データ全体を舐める必要があります。
比較対象のデータが、どういうふうに違うかにもよりますが、比較演算子だと先頭のバイトから順番に比較していくという実装になっていると思います。
ということは、比較対象が 10KB あっても先頭の数十倍とを比較しただけで違うという結果が分かる場合があるわけです。
比較する回数が少ないのであれば、単純な比較の方が早いと思います。
<?php $a = (binary)file_get_contents('a.bin'); $b = (binary)file_get_contents('b.bin'); if ($a == $b) { print "同じデータ"; } else { print "違うデータ"; } ?>
上記が当てはまらないのは、何度も比較が繰り返される場合。
その場合は、ハッシュをあらかじめ求めておいて、どこかに取っておくのが良いです。
file_get_contens をする前にハッシュ値だけを比較する。
ハッシュ値が違っていれば、「違うデータ」。
もし、ハッシュ値が同じであれば、あらためて、それぞれのデータを file_get_contents してバイナリで比較する。
という感じになるかと思います。
「同一のハッシュ値になる可能性はあるにはあるが、無視できる程度に非常に確率は低い」という理解であっていますでしょうか。
例えば、SHA-1 の場合、どんなデータでも 160bit のハッシュ値にします。
160bit の情報量は、2 の 160 乗ですから、相手が完全にランダムなデータであれば、衝突する確率は となります。
こういう書き方をすると、「無視できます」って書いてるみたいですね。
同一判定が「たまに間違っても良い」ということが許されるならば、ハッシュ値だけの比較でも良いです。
でも、ハッシュを扱う場合には、「ハッシュ値は衝突することがあるから、ハッシュ値の比較だけで、同一判定をしてはいけない」です。