2012-04-17 2 views
0

이미지 파일의 md5를 데이터베이스에 저장하여 사용자가 다른 이미지를 보내고 싶을 때하고 싶습니다. 이미지가 데이터베이스에 이미 존재하는지 비교해보고, 이미 데이터베이스에있는 이미지가 있는지 알아야합니다. 가장 쉬운 방법은 파일의 내용을 md5하고 md5 출력과 비교하여 파일이 맞는지 확인하는 것입니다. 같거나 틀리다.바이너리 파일 내용을 md5로 저장하고 나중에 다른 파일과 비교할 수 있습니다.

어떻게 할 수 있습니까? 이 작업이 그리 좋지 않다고 생각되면 당장 원본 파일이 없어도 다른 이미지를 비교할 것을 제안 할 수 있습니다. 그래서 md5를 데이터베이스에 저장합니다.

나는 md5 함수를 가지고있다. 그러나 나는 무엇을 md5할지 모른다. md5 함수는 std :: string 매개 변수를 받아들이고 결과를 std :: string으로 반환한다.

미리 감사드립니다.

답변

2

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

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

나는 MD5 갈 방법이라고 생각합니다. 이미지를 비교하는 모든 이미지 처리 작업은 MD5 계산보다 오래 걸릴 것입니다. std::string로 바이너리 모드에서 파일을 읽기 -

1 :

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를 검색 지금

, 당신은 휴식에 작은 단계에이 작업이 필요합니다 파일의 :

+0

의 답변과 같이 단순한 32 비트 솔루션을 제공합니다. 감사! – Grego

0

데이터베이스가 지속성이 필요하면 sqlite와 같은 데이터베이스 API를 사용하고 해시가 포함 된 데이터베이스에 이미지를 기본 키로 저장하십시오. 그렇지 않으면 해시로 이미지를 인덱싱 할 수있는 방법으로 std::map 또는 std::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://www.sqlite.org/capi3ref.html

+0

저는 데이터베이스가 거대 할 것이기 때문에 Blob을 사용하는 것을 피하고 싶습니다. 단지 프로그램이 데이터베이스에 작은 양의 md5를 저장하려고하므로 처리를하고 싶습니다. 비교하는 것, 그게 다에요. 이 일을하는 법을 아십니까? – Grego

+0

@Grego 이미지를 가져와야하는 파일 경로 또는 고유 식별자를 넣는 blob을 사용하는 대신지도 또는 데이터베이스와 같은 연관 컨테이너가 뒤에 있습니다. – 111111

+0

답변 해 주셔서 대단히 감사합니다. 그러나 md5를 사용하는 것이 가장 좋은 답변입니다. @karlphillip – Grego

0

Qt/C++을 사용하고 싶거나 할 수 있다면 꽤 쉽게 할 수 있습니다. QPixmap

  • 계산 SHA1 해시, QLabel를 참조 - - QCryptographicHash

    QString sha1Hash = QCryptographicHash::hash(bytes, QCryptographicHash::Sha1).toHex(); 
    
    를 참조 QFileDialog
  • 디스플레이 이미지를 참조하십시오 - 당신은

    • 열기 이미지 파일을 선택하는 파일 대화 상자에 간단한 UI를 디자인 할 수 있습니다
    • 쿼리 데이터베이스 이 해시는 이미 있습니까? - 참조 : 이미지가없는 경우 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 
      } 
      

    (나는이 코드를 시도하지 않은 그냥 원시 스케치의)

    • 는, 현재 타임 스탬프를 등록 (?) 해시, 경로 및 파일 이름을 데이터베이스에 저장 한 다음 이미지를 미리 설정된 디렉토리에 복사합니다.
  • 관련 문제