Быстрый и простой алгоритм хеширования изображений

Мне нужен (желательно простой и быстрый) алгоритм хеширования изображений. Значение хеш-функции используется в справочной таблице, а не для криптографии.

Некоторые изображения являются «компьютерной графикой»; - т. е. однотонные заполненные тексты, растеризованные тексты и т. д., в то время как есть также «фотографические»; изображения - содержащие богатый цветовой спектр, в основном плавный, с разумной амплитудой шума.

Я также хотел бы, чтобы алгоритм хеширования можно было применять к конкретным частям изображения. Я имею в виду, что изображение можно разделить на ячейки сетки, и хеш-функция каждой ячейки должна зависеть только от содержимого этой ячейки. Так что можно быстро определить, если два изображения имеют общие области (в случае, если они выровнены надлежащим образом).

Note: Мне нужно только знать, если два изображения (или их части)identical, То есть мне не нужно сопоставлять аналогичные изображения, нет необходимости в распознавании признаков, корреляции и других методах DSP.

Интересно, что является предпочтительным алгоритмом хеширования.

Для "фотографического" изображения просто XOR-все пиксели в ячейке сетки, более или менее нормально. Вероятность того же значения хеш-функции для разных изображений довольно низкая, особенно потому, что наличие (почти белого) шума нарушает все потенциальные симметрии. Плюс спектр такой хеш-функции выглядит хорошо (любое значение возможно с почти одинаковой вероятностью).

Но такой наивный алгоритм не может быть использован с «искусственным» графика. Одинаковые пиксели, повторяющиеся узоры, неизменность геометрического смещения очень распространены для таких изображений. Выполнение XOR всех пикселей даст 0 для любого изображения с четным числом идентичных пикселей.

Использование чего-то подобного CRT-32 выглядит несколько многообещающе, но я бы хотел выяснить что-то быстрее. Я думал об итерационной формуле, каждый новый пиксель изменяет текущее значение хеша, например:

hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */

Выполнение простого числа по модулю, вероятно, должно дать хороший разброс, так что я склоняюсь к этому варианту. Но я хотел бы знать, есть ли лучшие варианты.

Заранее спасибо.

Ответы на вопрос(2)

Ваш ответ на вопрос