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

如果您需要数据库是持久的,只需使用像 sqlite 这样的数据库 API,并将图像(作为 blob)保存在数据库中,哈希具有它的主键。如果没有,那么只需将哈希存储在 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 回答
0

如果您可以/想要使用 Qt/C++,这很容易做到。你甚至可以设计一个简单的 UI 来

  • 打开文件对话框以选择图像文件 - 请参阅QFileDialog
  • 显示图像 - 见QLabel , QPixmap
  • 计算 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 回答