ハッシュから任意のバイトを除外するとすぐに、それらのバイトのみが異なるファイルを(故意または偶然に)作成する機会を誰かに与え、したがって同じハッシュを作成します。
この画像が実際に元の画像とどの程度異なるかは、ハッシュから除外するバイト数と場所によってある程度異なります。ただし、最初に許容できるハッシュ衝突(意図的/偶発的およびメジャー/マイナー)を決定する必要があります。次に、使用できるハッシュ関数の速度と、それに含める必要のあるデータの量について考えることができます。
データ変更の「大きなブロック」を許容するつもりがない限り、ハッシュにすべての「大きなブロック」からのバイトを含める必要があります。I / Oパフォーマンスの観点からは、これはファイル全体にアクセスする必要があることを意味します。1バイトを読み取るだけでも、ハードウェアはそれを含むブロック全体を読み取るためです。
おそらく、ファイル全体のSHA-256ハッシュなど、「間違いなく十分」から始めることです。それがどれほど遅いかを確認してから、必要な割合でパフォーマンスを向上させる方法を考えてください。たとえば、速度が50%遅すぎる場合は、より高速な(安全性の低い)ハッシュを使用して問題を解決できますが、それでもすべてのデータを含めることができます。
完全に些細なハッシュ(たとえば、ファイル内のすべての4バイトワードのXOR)を実装することで、安全性の低いハッシュを使用できる速度の限界を計算し、その実行速度を確認できます。それでも遅すぎる場合は、精度をあきらめて、ファイルの一部のみをハッシュする必要があります(I / Oを最適化するためにすでに最善を尽くしていると仮定します)。
衝突を許容する場合は、ほとんどの(すべての?)画像形式で、「通常の」写真を一意に識別するのに十分な情報がヘッダーだけにあります。これは、意図的な衝突や画像処理の結果からあなたを保護するものではありませんが、タイムスタンプ、画像サイズ、カメラモデルなどの悪意を除けば、少量の画像データと一緒に、実際には「誰かが何かの写真」。したがって、それに基づいて、ファイルの最初の64〜128kだけをハッシュし(またはそれ以下、EXIFヘッダーの最大サイズといくつかを含めることができます)、最も実用的な目的で機能するハッシュを作成できます。誰かがしたい場合は殴られます。
ところで、真剣に有能な写真家によって意図的に行われない限り(またはこれを達成するために画像が意図的に後処理されない限り)、右下隅にわずかな違いがある同じシーンの2つの写真を撮ると、最初に同じバイトになることはありません画像データの。あなたが光を制御することができない環境にいるなら、近くさえありません。試してみてください。画像にタイムスタンプを付ける一般的なカメラを使用した場合、同じファイルになることはありません。したがって、事故から身を守るだけの場合は、欺瞞から身を守る場合よりも、問題がはるかに簡単になります。