2012-04-17 57 views
0

我想將圖像文件的md5保存在數據庫中,這樣當用戶發送另一個圖像時,我希望能夠比較圖像是否已經存在於數據庫中,我必須知道它們是否已經是數據庫中的其中一個,我認爲最簡單的方法是將md5文件的內容與md5輸出進行比較,看它們是否是平等與否。保存在字符串中的二進制文件內容,以便能夠與其他文件進行比較

我該怎麼做?如果你認爲這樣做不是很好,那麼你可以建議一些其他的東西來比較圖像,而不需要將原始文件存在,這就是爲什麼我要將md5保存在數據庫中。

我有md5函數,但我不知道md5是什麼,我的md5函數接受一個std :: string參數並將結果作爲std :: string返回。

預先感謝您。

回答

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); 
+0

。謝謝! – Grego 2012-04-17 16:17:18

0

如果你需要數據庫是持久的,只需使用像sqlite這樣的數據庫API,然後將圖像(作爲blob)保存在數據庫中,使用hash作爲主鍵。如果沒有,那麼只需將散列存儲在std::mapstd::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

+0

我想避免這種情況,我想避免使用Blob,因爲我的數據庫將是巨大的,我只是想要進行處理,因爲程序將存儲少量數據庫,只是一個md5比較,就是這樣。你知道如何做到這一點? – Grego 2012-04-17 14:37:38

+0

@Grego而不是使用blob放置您必須檢索圖像的文件路徑或唯一標識符,您所追求的是像地圖或數據庫這樣的關聯容器。 – 111111 2012-04-17 15:42:07

+0

非常感謝您的回答,但使用md5是最好的答案,它使@ 32位解決方案成爲簡單的解決方案,就像我在想的那樣@karlphillip – Grego 2012-04-17 16:17:05

0

如果你可以/想要使用Qt/C++,這很容易做到。你甚至可以設計一個簡單的用戶界面,以

  • 打開文件對話框,選擇一個圖像文件 - 見QFileDialog
  • 顯示圖像 - 見QLabelQPixmap
  • 計算SHA1哈希 - 見QCryptographicHash

    QString sha1Hash = QCryptographicHash::hash(bytes, QCryptographicHash::Sha1).toHex(); 
    
  • 查詢數據庫這個散列已經存在嗎? - 參見:Qt SQL module

    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 
    } 
    

(我沒試過這個代碼,它只是一個原始草圖)

  • 如果圖像是不存在的,註冊當前時間戳,(?)散列,路徑和文件名,然後將圖像複製到預設目錄。
相關問題