На тот случай, если кто-нибудь столкнется с этой проблемой (и не испытывает особого опыта хеширования, в частности чего-то вроде изображения), вот ОЧЕНЬ простое решение, которое я использовал для хеширования QPixmaps и ввода их в таблицу поиска для последующего сравнения :
qint32 HashClass::hashPixmap(QPixmap pix)
{
QImage image = pix.toImage();
qint32 hash = 0;
for(int y = 0; y < image.height(); y++)
{
for(int x = 0; x < image.width(); x++)
{
QRgb pixel = image.pixel(x,y);
hash += pixel;
hash += (hash << 10);
hash ^= (hash >> 6);
}
}
return hash;
}
Вот сама функция хеширования (вы можете использовать ее в qint64, если хотите меньше коллизий). Как вы можете видеть, я преобразовываю растровое изображение в QImage, просто прохожу его размеры и выполняю очень простой одноразовый хэш для каждого пикселя и возвращаю конечный результат. Есть много способов улучшить эту реализацию (см. Другие ответы на этот вопрос), но это основная суть того, что необходимо сделать.
ОП упоминал, как он будет использовать эту функцию хеширования, чтобы затем построить таблицу поиска для последующего сравнения изображений. Это потребует очень простой функции инициализации поиска - что-то вроде этого:
void HashClass::initializeImageLookupTable()
{
imageTable.insert(hashPixmap(QPixmap(":/Image_Path1.png")), "ImageKey1");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path2.png")), "ImageKey2");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path3.png")), "ImageKey2");
// Etc...
}
Я использую здесь QMap с именем imageTable, который должен быть объявлен в классе как таковой:
QMap<qint32, QString> imageTable;
Затем, наконец, когда вы хотите сравнить изображение с изображениями в вашей справочной таблице (то есть: «какое изображение, из известных мне изображений, может быть это конкретное изображение?»), Вы просто называете хеширующая функция на изображении (которая, я предполагаю, также будет QPixmap) и возвращаемое значение QString позволит вам понять это. Примерно так будет работать:
void HashClass::compareImage(const QPixmap& pixmap)
{
QString value = imageTable[hashPixmap(pixmap)];
// Do whatever needs to be done with the QString value and pixmap after this point.
}
Вот и все. Я надеюсь, что это кому-то поможет - это сэкономило бы мне некоторое время, хотя я был счастлив иметь опыт выяснения этого.