(できればシンプルで高速な)画像ハッシュアルゴリズムが必要です。ハッシュ値は、暗号化ではなくルックアップ テーブルで使用されます。
画像の一部は「コンピューター グラフィック」です。つまり、単色で塗りつぶされた四角形、ラスタライズされたテキストなどです。一方、「写真」画像もあります。豊富なカラー スペクトルを含み、ほとんどが滑らかで、妥当なノイズ振幅があります。
また、特定の画像部分にハッシュ アルゴリズムを適用できるようにしたいと考えています。つまり、画像はグリッド セルに分割でき、各セルのハッシュ関数はこのセルの内容のみに依存する必要があります。そのため、2 つの画像に共通の領域がある場合 (適切に配置されている場合) にすばやく見つけることができます。
注: 2 つの画像 (またはその一部) が同一であるかどうかを知る必要があるだけです。つまり、類似した画像を照合する必要はありません。特徴認識、相関、およびその他の DSP 手法は必要ありません。
好ましいハッシュアルゴリズムは何だろうか。
「写真」画像の場合、グリッドセル内のすべてのピクセルをXORするだけで、多かれ少なかれ問題ありません。異なる画像のハッシュ値が同じである可能性は非常に低く、特に (ほぼ白色の) ノイズの存在がすべての潜在的な対称性を壊すためです。さらに、そのようなハッシュ関数のスペクトルは良好に見えます (ほぼ同じ確率で任意の値が可能です)。
しかし、そのような単純なアルゴリズムは、「人工的な」グラフィックスでは使用できない場合があります。このような画像では、同一のピクセル、繰り返しパターン、幾何学的なオフセットの不変性が非常に一般的です。すべてのピクセルを XOR すると、同一のピクセルが偶数個ある画像では 0 になります。
CRT-32 のようなものを使用することはやや有望に見えますが、より高速なものを見つけたいと考えています。反復式について考えました。新しいピクセルごとに、次のように現在のハッシュ値が変化します。
hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */
モジュロ素数を実行すると、おそらく適切な分散が得られるはずなので、このオプションに傾いています。しかし、より良いバリアントがあるかどうか知りたいです。
前もって感謝します。