Как насчет этого. Строка хэша состоит из групп из трех символов, представляющих красный, зеленый и синий:
{R0, G0, B0}, {R1, G1, B1}, {R2, G2, B2}, ...
Для каждой группы размер изображения уменьшается до 2 ^ N на 2 ^ N квадрата. Тогда значение является суммой (скажем, 255 или любой другой вашей кодировки) различий в интенсивности каждого из цветов в течение некоторого прохода через пиксели.
Таким образом, в качестве небольшого примера, например, для вычисления группы 1 (изображение 2x2) можно использовать следующий код (я беспокоился только о красном пикселе)
int rSum = 0;
int rLast = 0;
for (int i=0; i<2; i++) {
for (int j=0; j<2; j++) {
rSum += Math.abs(image[i][j].r - rLast);
rLast = image[i][j].r;
}
}
rSum %= 255;
Я считаю, что это свойство заключается в том, что похожие изображения должны быть близки друг к другу, как для каждого символа в хеше, так и с точки зрения последовательных символов в хэше.
Хотя при более высоких значениях N вероятность столкновения возрастает (многие изображения будут иметь одинаковые значения суммы разностей для интенсивностей RG и B через них), каждая последующая итерация должна раскрывать новую информацию об изображении, которая не был протестирован с предыдущей итерацией.
Может быть довольно дорого в вычислительном отношении, но у вас есть преимущество (которое я могу вывести из вашего вопроса, который вы, возможно, пожелаете), что вы можете завершить вычисление хэша, как только отрицательный будет обнаружен в пределах определенного порога.
Просто идея, дайте мне знать, если мне непонятно!