Я не думаю, что эту проблему можно решить с помощью хеширования. Вот в чем сложность: предположим, у вас есть красный пиксель, и вы хотите, чтобы 3 и 5 хэшировали одно и то же значение. Ну, тогда вы также хотите, чтобы 5 и 7 хэшировали одно и то же значение, а 7 и 9 и т. Д. Вы можете создать цепочку, которая говорит, что вы хотите, чтобы все пиксели хэшировали одно и то же значение.
Вот что я хотел бы попробовать вместо:
- Создайте огромное B-дерево с 32-полосным разветвлением на каждом узле, содержащее все изображения.
- Все изображения в дереве имеют одинаковый размер или не являются дубликатами.
- Дайте каждому цветному пикселю уникальное число, начинающееся с нуля. Верхний левый может быть пронумерован 0, 1, 2 для компонентов R, G, B, или вам лучше со случайной перестановкой, потому что вы собираетесь сравнивать изображения в порядке этой нумерации.
- Внутренний узел на глубине n различает 32 пути по значению пикселя n, деленному на 8 (это позволяет получить часть шума в соседних пикселях.
- Листовой узел содержит небольшое количество изображений, скажем, от 10 до 100. Или, возможно, количество изображений является функцией увеличения глубины, поэтому, если у вас есть 500 дубликатов одного изображения, после определенной глубины вы прекращаете попытки различать их.
В дерево вставляются все два миллиона узлов, два изображения дублируются, только если они находятся в одном узле. Правильно? Неправильно! Если значение пикселя в двух изображениях равно 127 и 128, одно переходит в аутендж 15, а другое - в аутедж 16. Таким образом, на самом деле, когда вы различаете пиксель, вы можете вставить это изображение в одного или двух потомков. :
- Для яркости
B
, вставьте в B/8
, (B-3)/8
и (B+3)/8
. Иногда все 3 будут равны, и всегда 2 из 3 будут равны. Но с вероятностью 3/8 вы удваиваете количество выемок, на которых появляется изображение. В зависимости от того, насколько глубоки дела, у вас может быть много дополнительных узлов.
Кто-то другой должен будет сделать математику и посмотреть, нужно ли вам делить что-то больше чем 8, чтобы избежать слишком большого дублирования изображений. Хорошая новость заключается в том, что даже если истинное разветвление составляет всего около 4, а не 32, вам нужно только дерево глубины 10. Четыре дублирования в 10 позволяют получить до 32 миллионов изображений на листьях. Я надеюсь, у вас есть много оперативной памяти в вашем распоряжении! Если нет, вы можете поместить дерево в файловую систему.
Дайте мне знать, как это происходит!