2017-11-23 4 views
0

私はデータベースに多くの画像を雑誌になるスクリプトを作成します。私はマガジンのユニークなイメージが欲しいので、イメージを取得することがデータベースに存在するかどうか毎回チェックする必要があります。そして、これは私の問題です。私のデータベースのレコードが〜1000000レコードのとき、どうすれば短時間でそれを行うことができますか?PHP/SQL - たくさんの画像を比較

$image = file_get_contents('http://server.com/imageX.jpg'); 
$counter = strlen($image); 
// $counter => for example: 105188 

が続いてデータベースにこの番号を保存し、INTO IGNORE INSERTを使用します:

私の考えでは、すべての画像の使用はstrlen()である。このイメージが追加される場合

INSERT IGNORE INTO `database` (`unique_counter`, `img_url`, `img_name`) VALUES (105188, 'http://server.com/imageX.jpg', 'imageX.jpg') 

と - すべて大丈夫ですか?しかし、私はこのアイデアが~100枚の画像に適していると思います。私は1000000以上の画像を持ち、これらの画像のすべてが同じサイズ(幅と高さ)を持っていると、画像が同じでないときにも私のアイデアからのカウンターが同じになることがあります。

お手伝いできますか?私は非常に短時間でデータベースからの多くの画像をどのように比較できますか?

ありがとうございました。

+1

はいけないファイルサイズを使用するメモリの制限に影響を与えることなく、それをハッシュを代わりに取得することができますmd5/sha1では、URLが一意であるだけでなく、 –

+0

@LawrenceCheroneしかし、それは私の最初のポスト取得イメージ、ハッシュ、それからカウントしてもまだ考えています。私は1.000.000以上のイメージを持っていると、この方法は私にとってはうまくありません。同じ長い値を持ちます。 –

+1

md5と言ってハッシュすると、衝突の確率は2^32になります。ファイルサイズは決してありません。 –

答えて

2

イメージのハッシュを作成してからデータベースに保存する必要があります。

あなたは非常に大規模なイメージをお持ちの場合は小さいファイル

をするためにハッシュを取得するために$hash = md5_file($file_path);を使用することができますし、ハッシュ、

function get_hash($file_path, $limit = 0, $offset = 0) { 

    if (filesize($file_path) < 15728640) { //get hash for less than 15MB images 
     // md5_file is always faster if we don't chunk the file 
     $hash = md5_file($file_path); 

     return $hash !== false ? $hash : null; 
    } 

    $ctx = hash_init('md5'); 

    if (!$ctx) { 
     // Fail to initialize file hashing 
     return null; 
    } 

    $limit = filesize($file_path) - $offset; 

    $handle = @fopen($file_path, "rb"); 
    if ($handle === false) { 
     // Failed opening file, cleanup hash context 
     hash_final($ctx); 

     return null; 
    } 

    fseek($handle, $offset); 

    while ($limit > 0) { 
     // Limit chunk size to either our remaining chunk or max chunk size 
     $chunkSize = $limit < 131072 ? $limit : 131072; 
     $limit -= $chunkSize; 

     $chunk = fread($handle, $chunkSize); 
     hash_update($ctx, $chunk); 
    } 

    fclose($handle); 

    return hash_final($ctx); 
} 
+1

私はURLからイメージコードを取得し、それをハッシュ(md5、shaなど)し、このハッシュをデータベースに保存する必要があります。それでは、このハッシュだけを比較してください。そして、これは私にとって最高のアイデアですか? –

+0

正確には、それは素晴らしい作品です。数百万のファイルと画像に対して同じことをするアプリケーションを実行しています – Thamaraiselvam

0
$info = getimagesize('http://server.com/imageX.jpg'); 

$info['time'] = time();// You can add microtime if needed.. 

$hash = base64_encode(json_encode($info)); 

INSERT IGNORE INTO `database` (`hash`, `img_url`, `img_name`) VALUES ($hash, 'http://server.com/imageX.jpg', 'imageX.jpg')