0

画像ファイルの md5 をデータベースに保存したいので、ユーザーが別の画像を送信したときに、画像がデータベースに既に存在するかどうかを比較できるようにしたいので、それらのいずれかが既にデータベースにあるかどうかを知る必要がありますデータベースの場合、最も簡単な方法は、ファイルのコンテンツを md5 し、md5 の出力と比較して、それらが等しいかどうかを確認することだと思いました。

どうすればそれができますか?これがあまり良くないと思われる場合は、現時点で元のファイルが存在しない状態で画像を比較する別の方法を提案できます。そのため、md5 をデータベースに保存しています。

私は md5 関数を持っていますが、md5 の意味がわかりません。私の md5 関数は std::string パラメータを受け入れ、結果を std::string として返します。

前もって感謝します。

4

3 に答える 3

2

MD5が進むべき道だと思います。画像を比較するための画像処理操作は、おそらくMD5の計算よりも時間がかかります。

ここで、この操作を小さなステップに分割する必要があります。

1-バイナリモードのファイルをstd::string:に読み込みます

string data;
string filename("file.bin");
ifstream input_file( filename.c_str(), ios::binary | ios::in );
if( !input_file)
{
    cout << "!!! Failed to open file";
    // exit/return
}

std::ostringstream ss;
ss << input_file.rdbuf();
data = ss.str();

input_file .close();

2-ファイルのMD5を取得します。

std::string md5_hash = compute_md5(data);
于 2012-04-17T14:50:57.220 に答える
0

Qt/C++ を使用できる/使用したい場合、これは非常に簡単です。シンプルなUIをデザインすることもできます

  • ファイル ダイアログを開いて画像ファイルを選択します - QFileDialogを参照してください
  • 画像を表示 - QLabelQPixmapを参照
  • SHA1 ハッシュを計算します - QCryptographicHashを参照してください

    QString sha1Hash = QCryptographicHash::hash(bytes, QCryptographicHash::Sha1).toHex();
    
  • クエリ データベースにこのハッシュは既に存在しますか? - 参照: Qt SQL モジュール

    bool isRegistered(const QString hash){
    
       QSqlQuery query(QSqlDatabase::database("default"));
    
       query.prepare("SELECT COUNT(1) FROM pixmap WHERE hash=?");
       query.bindValue(0, sha1Hash);
       query.exec();
    
       if(query.first()){
           return query.value(0).toInt() > 0;
       }
    
       return false; // It isn't
    }
    

(私はこのコードを試していません。これは生のスケッチです)

  • 画像が存在しない場合は、現在のタイムスタンプ(?)、ハッシュ、パス、ファイル名をデータベースに登録してから、画像を事前に設定したディレクトリにコピーします。
于 2012-04-17T15:37:58.617 に答える
0

データベースを永続化する必要がある場合は、sqlite などのデータベース API を使用し、画像をデータベースに (ブロブとして) 保存し、ハッシュには主キーを指定します。そうでない場合は、ハッシュを astd::mapまたは astd::unordered_mapに保存するだけで、ハッシュで画像にインデックスを付けることができます。

 std::string image=load_image("my_image.jpg");
 std::string db=make_hash(image);
 std::map<std::string, std::string> db;
 db[hash]=image;

またはそのようなもの、私は個人的に画像を保存しませんstd::string。それは、作業している画像の種類に依存するためです。しかし、それは私が思う別の質問です。

http://en.cppreference.com/w/cpp/container/map

http://en.cppreference.com/w/cpp/container/unordered_map

http://www.sqlite.org/capi3ref.html

于 2012-04-17T14:26:00.327 に答える